无法在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 问题