为什么我的表单无法在Spring Boot中传递信息

时间:2019-01-20 16:46:07

标签: java hibernate spring-boot thymeleaf

您好,我正在以表格的形式传递信息,并且一切运行正常,但是当我填写表格时,它没有传递信息,并且出现此错误。

发生意外错误(类型=内部服务器错误,状态= 500)。 由以下原因引起:org.hibernate.exception.ConstraintViolationException:无法执行语句 原因:java.sql.SQLIntegrityConstraintViolationException:列“ movie_id”不能为空

我正在使用的代码如下:

@PostMapping("/save")
public String save(Movie movie) {
    savedMovie.save(movie);
    return "redirect:/LatestMovies";
}

 <form th:action="@{/save}" method="post" >
    <p><input type="text" id="movie_id" name="movie_id" value="" /></p>
    <p><input type="text" id="movie_name" name="movie_name" value="" /></p>
    <p><input type="submit" value="save" /></p>
     </form>

我相信所有其他代码都是正确的,因为如果我尝试呈现数据库信息我没有问题。

更新

这是完整的html代码。

<div class="container">   
<table class="table table-hover">
    <tr>
        <th>Id</th>
        <th>Name</th>
    </tr>
    <tr th:each="LatestMovies : ${latestMovies}">
        <td th:text="${LatestMovies.id}"></td>
        <td th:text="${LatestMovies.movieName}"></td>
        <td>
       <form th:action="@{/save}" method="post" th:object="${newMovie}">
<p><input type="text" id="movie_id" th:field="*{movie_Id}"/></p>
<p><input type="text" id="movie_name" th:field="*{movie_Name}"/></p>
<p><input type="submit" value="save" /></p>
    </form>
</td>

    </tr>
</table>

3 个答案:

答案 0 :(得分:3)

您的控制器期待一个Movie对象,但它接收到其他东西,然后生成一个空Movie对象。您需要在表单中使用th:object才能正确发送相应的类。首先,让我们向控制器添加一个新的@ModelAttribute,以便您的表单可以自动在表单中映射Movie对象。

控制器

// In order to use th:object in a form, we must be able to map a new entity to that form.
// In this case we return a Movie entity.
@ModelAttribute(value = "newMovie")
public Movie newMovie() {return new Movie();}

现在,让我们更改您的表单,以便它实际上发送一个Movie对象。

<form th:action="@{/save}" method="post" th:object="${newMovie}">
    <p><input type="text" id="movie_id" th:field="*{movie_id}"/></p>
    <p><input type="text" id="movie_name" th:field="*{movie_name}"/></p>
    <p><input type="submit" value="save" /></p>
</form>

请注意,我还更改了输入中的name的{​​{1}}属性。请记住,为了使它起作用,每个字段的名称必须与对象中的名称完全匹配。

更新

如果您想在不使用th:field的情况下为表单设置默认值,并且由于无法将jsth:field结合使用,则可以在其中设置对象的属性控制器。

th:value

更新2

如果要在表单中放置Thymeleaf列表的当前迭代,则可以执行以下操作。

@ModelAttribute(value = "newMovie")
public Movie newMovie() {
    Movie movie = new Movie();
    movie.setName("Test");
    return movie;
}

答案 1 :(得分:1)

您忘了用@RequestBody批注标记方法参数。

答案 2 :(得分:0)

发生这种情况是因为您试图从表单发送到控制器的电影对象未正确映射。结果,通过尝试向其中插入非null值而违反了您在电影表中具有movie_id的约束(我想PK不是null)。如果您希望将前端页面表单中形成的对象绑定到Java对象中,则可以尝试

首页表格

<form:form action="save" modelAttribute="movie" method="POST">
    <form:label path = "movie_id"> Movie id</form:label>
    <form:input path="movie_id" name="movie_id">
    <form:label path = "movie_name"> Movie name</form:label>
    <form:input path="movie_name" name="movie_name">
    <button type="submit">save</button>
</form:form>

(您应该在页面上导入springframework表单taglib     <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

保存控制器代码

@PostMapping("/save")
public String save(@ModelAttribute("movie") Movie movie) {
savedMovie.save(movie);
return "redirect:/LatestMovies";
}

我当然假设您的对象具有如下所示的类似结构

电影课

public class Movie{
  private String movie_id; // or int or long
  private String movie_name;
  //getters setters constructors ommitted
}