无法在spring boot data rest中直接发布到子资源

Posted

技术标签:

【中文标题】无法在spring boot data rest中直接发布到子资源【英文标题】:Cant Post directly to sub-resouce in spring boot data rest 【发布时间】:2017-01-18 02:53:09 【问题描述】:

我有一个基本的 spring boot 数据 rest api,其中包含许多 cmets 的帖子。我的问题是我似乎无法找到将我的评论直接发布到子资源 uri 的方法,例如 http://localhost:8090/posts/1/comments。

我能够做到的唯一方法是首先在http://localhost:8090/comments 创建评论资源,然后将评论的uri 发布到http://localhost:8090/posts/1/comments。

这似乎是一个非常糟糕的主意,因为 cmets 永远不能独立存在,并且只能链接到帖子。

有谁知道我如何将其作为一项操作来完成,否则我将不得不手动处理潜在的孤立 cmets,其中评论已发布但无论出于何种原因永远不会发布到 http://localhost:8090/posts/1/comments。

我的代码如下。 任何帮助将不胜感激。

@Entity
public class Comment extends ResourceSupport 

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonIgnore
private Long id;

private String comment;

@ManyToOne
private Post post;

@ManyToOne
private User sender;

protected Comment() ;

public void setId(Long id) 
    this.id = id;


public String getComment() 
    return comment;


public void setComment(String comment) 
    this.comment = comment;


public User getSender() 
    return sender;


public void setSender(User sender) 
    this.sender = sender;


public Post getPost() 
    return post;


public void setPost(Post post) 
    this.post = post;



@Entity
public class Post extends ResourceSupport 

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private @JsonIgnore Long id;

private String text;

@OneToMany
private List<Comment> comments;

protected Post () ;

public String getText() 
    return text;


public void setText(String text) 
    this.text = text;


public List<Comment> getComments() 
    return comments;


public void setComments(List<Comment> comments) 
    this.comments = comments;



@RepositoryRestResource
public interface PostRepository extends PagingAndSortingRepository<Post, Long> 

@RepositoryRestResource
public interface CommentRepository extends PagingAndSortingRepository<Comment, Long> 


@SpringBootApplication
@EnableJpaRepositories("rest.api.repository")
@EnableWebMvc
@EnableTransactionManagement
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer

public static void main(String[] args) 
    SpringApplication.run(Application.class, args);


用于尝试将评论发布到帖子中的 json 是


   "comment": "some text",
   "sender": "http://localhost:8090/users/1"

【问题讨论】:

json 似乎错误。如果帖子已经存在,为什么不使用帖子 ID 发布呢?另外,“发件人”来自哪里,为什么它是您的 api 的 url?最后,您的 ide 或浏览器是否出现任何错误? 我刚刚意识到 id 在示例中遗漏了发件人(我将代码剪掉并不小心将其剪掉了)我现在修改它。 我仍然不确定为什么您的发件人是这样的。我认为将post: 对象和sender: 对象添加到您的json 将是一个开始。但是你需要post id。或者您可以为用户发送 id 并从您的服务中发布和检索它们并以这种方式添加它们;我不会通过 api 发布它们。首先,尝试在浏览器控制台打开的情况下发布帖子,如果您遇到任何错误,请告诉我们。 好的。好吧,我尝试过包含帖子网址,但这也不起作用。生病的实验,让你知道。我得到的状态码也是'204 no content' 不是网址。例如,发表评论但尚未与帖子相关联。你的 js 代码可能看起来像 comment.post = thePost;; sender 也一样(如果你有的话)。 【参考方案1】:

事实证明,我需要在我的 Post 类的 cmets 列表中使用映射,即 @OneToMany(mappedBy = "post")。 现在我可以发布到http://localhost:8090/comments,然后当我像以前一样关注http://localhost:8090/posts/1/comments 链接时,我现在看到了 cmets。

【讨论】:

以上是关于无法在spring boot data rest中直接发布到子资源的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:无法从另一个 Origin 访问安全资源 - CORS - Spring Security - Spring data rest

Spring Boot Data Rest + CORS 未正确启用 OPTIONS/DELETE

在Spring Boot Data JPA Rest API中使用PostgreSql时,表未找到错误

Spring boot 2.0.3.RELEASE, Spring data rest, application error, failed to start

在 Spring Boot Data REST 中进行实体验证后运行 @HandleBeforeCreate

Spring Boot + Spring Data Rest Repositories 中使用 @CrossOrigin 注释的 CORS 问题