为啥我的表单没有在 Spring Boot 中传递信息

Posted

技术标签:

【中文标题】为啥我的表单没有在 Spring Boot 中传递信息【英文标题】:why is my form not passing information in spring boot为什么我的表单没有在 Spring Boot 中传递信息 【发布时间】:2019-06-14 04:13:35 【问题描述】:

您好,我在表单中传递信息,一切正常,但是当我填写表单时,它没有传递信息,我收到此错误。

出现意外错误(类型=内部服务器错误,状态=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>

【问题讨论】:

正如错误所说,当您试图保存到数据库时,您的 movie_id 为空。检查为什么 movie_id 为空 你可以看到我在该字段的表单中传递信息 【参考方案1】:

您的控制器需要一个 Movie 对象,但它正在接收其他内容,然后生成一个 null 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 属性,为th:field。请记住,为了使其工作,每个字段的名称必须与您的对象中的名称完全匹配。

更新

如果您想为表单设置默认值,而不使用js,并且由于您无法将th:fieldth:value 结合使用,您可以在控制器中设置对象的属性。

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

更新 2

如果您想要将 Thymeleaf 列表的当前迭代放入表单中,您可以执行以下操作。

<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" th:object="$LatestMovies" method="post">
              <p><input type="hidden" th:value="*id"/></p>
              <p><input type="hidden" th:value="*movieName"/></p>
              <p><input type="submit" value="Submit"/></p>
          </form>
      </td>
   </tr>
</table>

【讨论】:

我喜欢你的回答,你刚刚成功了,在过去的 3 天里,我尝试了 100 种不同的方法。现在我在任何地方都没有看到这种方法,相信我 3 个回答最多投票说没有 javascript 就无法从 Spring Boot 中的表单传递信息。 感谢您的评论!我很高兴能帮上忙:) 对不起,如果我再问你一点,但是......当我尝试向输入添加一个值时,它不接受它。我正在尝试这两种方法。 "

" 和 甚至输入常规信息,如 value="123" 而不是允许输入一个预定义的值
我用额外的信息编辑了我的答案。让我知道它是否解决了您的询问。如果是这样,那么投票会很棒:)。 一旦我的声望达到 15,相信我你就会拥有它。现在我确实将我的 html 代码更新为完整的。您的更新确实有效,但我要输入的信息是百里香列表的当前迭代。【参考方案2】:

您忘记使用@RequestBody 注释标记方法参数。

【讨论】:

这样吗? “公共字符串保存(@RequestParam 电影电影)” 是,但使用 @RequestBody 代替。 这样吗? "public String save(@RequestBody Movie movie) " 我现在收到此错误出现意外错误 (type=Unsupported Media Type, status=415)。【参考方案3】:

发生这种情况是因为您尝试从表单发送到控制器的影片对象未正确映射。因此,您在电影表中的 movie_id 的约束(我猜是 PK 不为空)被尝试插入非空值而被违反。如果您希望将前端页面表单中形成的对象绑定到 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 form taglib &lt;%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%&gt;)

保存控制器代码

@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

【讨论】:

感谢此回复。我确实尝试过这种方法,但我现在确实使用了 taglib,这可能是它不起作用的原因。现在这么说。在您的方法中,我如何制作输入前百里香叶迭代值的隐藏字段?

以上是关于为啥我的表单没有在 Spring Boot 中传递信息的主要内容,如果未能解决你的问题,请参考以下文章

@RequestParam 从邮递员的表单数据中传递 Spring Boot 中的 pojo 字段

在Spring boot中,如何将表单动作中的jsp表单输入的值作为参数传递

为啥我的idea中没有sping boot 1.5.7的版本

为啥我的 Spring Boot 启动器没有将其依赖项带到项目中?

如何使用spring boot将数据从一个html表单传递到多个表

为啥在将 Spring Data JPA 与 Spring Boot 结合使用时,我的数据库自定义没有得到应用?