【问题标题】:Spring MVC validation status 400Spring MVC 验证状态 400
【发布时间】:2015-04-03 13:02:42
【问题描述】:

我刚开始学习 Spring 并坚持使用表单验证(有 dao/service 和所有默认设置)

我尝试进行验证任务以防止在字段中插入超过 3 个符号

@Size (min = 1, max = 3)

之后我想将表单数据插入DB并输出到我的主页上,当数据满足我的验证并由1到3个符号组成时,一切正常,但是当这些条件不满足时,我尝试要插入 4 个或更多符号,我会收到 HTTP STATUS 400。没有 DB 插入,也没有视图输出。所以我知道有验证,但是我不明白为什么它显示HTTP STATUS 400

@Controller
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping(value = "addBook", method = RequestMethod.GET)
    public String addUser(Model model) {

        model.addAttribute("user", new ValidationField());
        model.addAttribute("book", new Book());

        return "addBook";
    }

    @RequestMapping(value = "addBook", method = RequestMethod.POST)
    public String addBook( @ModelAttribute("user") @Valid ValidationField validationField, Book book, BindingResult result) {
        /*this.user(book, result);*/

        if (result.hasErrors()) {
            return "addBook";
        }
        this.bookService.addBook(book);

        return "redirect:/";
    }
}

验证类

public class ValidationField {

    @Size(min = 1, max = 3)
    private String name;

    @Size(min = 1, max = 3)
    private String genre;
}

并查看 addBook.jsp

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<t:tamplate>
  <form:form method="post" action="addBook" commandName="book" modelAttribute="user">
      <form:errors path="*" cssClass="alert alert-danger" element="div" />
        <table>
            <tr>
                <td><form:input path="name"/></td>
                <td><form:errors path="name"/></td>
            </tr>
            <tr>
                <td><form:input path="genre" /></td>
                <td><form:errors path="genre"/></td>
            </tr>
            <tr>
                <td colspan="2"> <input type="submit" value="add book"> </td>
            </tr>
        </table>
    </form:form>
</t:tamplate>

【问题讨论】:

    标签: java spring spring-mvc jakarta-ee spring-validator


    【解决方案1】:

    您应该将您的 BindingResult 设置为立即跟随您的 ModelAttribute,例如

    public String addBook( @ModelAttribute("user") @Valid ValidationField validationField, BindingResult result, Book book)
    

    查看文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-methods的部分

    大多数参数可以以任意顺序使用,唯一的例外是 BindingResult 参数

    继续

    Errors 或 BindingResult 参数必须遵循模型对象 立即绑定,因为方法签名可能有 不止一个模型对象,Spring 将创建一个单独的模型对象 他们每个人的 BindingResult 实例

    【讨论】:

    • 能否再解释一下我到底应该怎么做?
    • 只需通过重新排序来更改方法的签名,以便 BindingResult 对象遵循 @ModelAttribute。我已经添加了签名的外观,纠正了一个错误。 BindingResult 是唯一隐含添加的参数,其中排序很重要,因为你可以有更多的 BindingResult 每个引用不同的 ModelAttributes,所以 spring 应用紧随其后的那个
    • 修正了另一个错字,所以只需像 @ModelAttribute("user") @Valid ValidationField validationField, BindingResult result, Book book 之类的参数排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2021-09-24
    • 2017-12-20
    • 2016-04-20
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多