所以,我正在尝试使用spring mvc,spring boot,spring data,jpa和thymeleaf在帖子上创建注释,到目前为止,我可以使用控制器和pathvariables到达我想要的特定页面,我可以按照我的要求加载页面,但是当我提交评论时,我收到了错误
There was an unexpected error (type=Bad Request, status=400).
Failed to convert value of type 'java.lang.String' to required type 'com.example.domain.Comment'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.lang.Long for value 'comment 1'; nested exception is java.lang.NumberFormatException: For input string: "comment1"
此错误仅在我的浏览器中,我的IDE中的控制台中没有任何内容。我也可以访问该页面,所以我不认为我的控制器中的get方法存在问题,但我不确定问题出在哪里,所以我会向你们展示我的一些代码
这是我的控制器。
private PostRepository postRepo;
@RequestMapping(value="viewCourse/post/{postId}", method=RequestMethod.GET)
public String postViewGet (@PathVariable Long postId, ModelMap model)
{
Post post = postRepo.findOne(postId);
model.put("post", post);
Comment comment = new Comment();
model.put("comment", comment);
return "post";
}
@RequestMapping(value="viewCourse/post/{postId}", method=RequestMethod.POST)
public String postViewPost (@ModelAttribute Comment comment, @PathVariable Long postId, ModelMap model)
{
Post post = postRepo.findOne(postId);
comment.setPost(post);
post.getComments().add(comment);
postRepo.save(post);
return "redirect:/viewCourse/{postId}";
}
@Autowired
public void setPostRepo(PostRepository postRepo) {
this.postRepo = postRepo;
}
这是我的百万美元html页面
<div class="PostContent">
<h2 th:text = "${post.title}"></h2>
<p th:text = "${post.content}"></p>
</div>
<br/>
<div class="CommentPost">
<form th:action="${post.id}" method="post" th:object="${comment}" id="comment">
<div class="form-group">
<textarea rows="2" th:field="${comment.comment}" class="form-control" placeholder="comment" id="comment"></textarea>
</div>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="submit" value="Comment" class="btn btn-success"/>
</form>
</div>
<br/>
<div class="Comments">
<div th:each = "comment : ${comments}" th:object="${comment}">
<span th:text="${comment.comment}"></span>
</div>
<div th:if = "${#lists.isEmpty(comments)}">
There are no comments to display
</div>
</div>
</div>
同样在这个页面上出现消息“没有要显示的评论”,就像我在代码中告诉它一样,但它仍然说“没有要显示的评论”,即使我手动插入注释数据库。
这是我的评论对象,虽然我很确定这很好。
@Entity
public class Comment {
public Long id;
public String comment;
public Post post;
public User user;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
@ManyToOne
public Post getPost() {
return post;
}
public void setPost(Post post) {
this.post = post;
}
@ManyToOne
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
我的postRepo,虽然这应该没问题,但我以为我会把它包括在内
public interface PostRepository extends JpaRepository <Post, Long>{
}
如果有人能看到我的问题,并让我知道,那就太棒了,谢谢。
答案 0 :(得分:0)
当你使用th:object不必引用object时,你可以直接访问object的属性。试试这段代码:
<div class="PostContent">
<h2 th:text = "${post.title}"></h2>
<p th:text = "${post.content}"></p>
</div>
<br/>
<div class="CommentPost">
<form th:action="${post.id}" method="post" th:object="${comment}" id="comment">
<div class="form-group">
<textarea rows="2" th:field="*{comment}" class="form-control" placeholder="comment" id="comment"></textarea>
</div>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="submit" value="Comment" class="btn btn-success"/>
</form>
</div>
<br/>
我没有在控制器中看到您将评论放在模型中。我认为帖子里面有评论,所以修改评论的参考值 post.comments
<div th:each = "comment : ${post.comments}" th:object="${comment}">
<span th:text="*{comment}"></span>
</div>
<div th:if = "${#lists.isEmpty(post.comments)}">
There are no comments to display
</div>
</div>
</div>
答案 1 :(得分:0)
问题是类的名称 - 注释 - 和字段 - 注释 - 是相同的,关于不敏感的方式,导致由于Java反射用于读取字段及其类的问题。
解决方案是重命名字段,例如&#34;评论&#34;到&#34;评论&#34;,并避免在数据库中再次更改,如果有的话,只需将注释@Column(name =&#34; comment&#34;)放在字段上方。
答案 2 :(得分:0)
也许,从所涉及的百里香模板上的主模板引用看起来像这样:
th:href="@{/post/{${post.getId()}}",
但它应该看起来像:
th:href="@{/post/{postId}(postId=${post.getId()})}"
就我而言,它帮助了我