2015-04-03 89 views
2

我刚开始学习Spring和坚持与表单验证(有刀/服务和所有默认设置)Spring MVC的验证状态400

我尝试做一个验证任务以防止插入到该领域超过3个符号

@Size (min = 1, max = 3) 

后,我希望在数据满足我的验证,由1至3个符号的插入表单数据到数据库并在我的主页输出它,那么一切都很好,但是当这些条件不符合,我尝试插入4个或更多的符号,我收到HTTP STATUS 400。没有数据库插入和没有视图输出。所以,我明白,有验证,但我不明白为什么它会告诉我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> 

回答

5

你应该设置您的BindingResult立即关注您的ModelAttribute eg

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

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

大多数参数可以以任意顺序使用的BindingResult参数

,并在延续,唯一​​的例外

错误或BindingResult参数ha已经跟随正被立即绑定方法签名模型对象 可能有 不止一个模型对象和Spring会为他们每个人

+0

创建单独的 BindingResult例如是否可以解释一下更多我应该怎么做? – Sabine 2015-04-03 14:01:24

+0

只需通过重新排序来更改方法的签名,以便* BindingResult *对象遵循* @ ModelAttribute *。我已经添加了签名的外观,纠正了一个错误。 BindingResult是排序中唯一必须添加的参数,'因为你可以有更多的BindingResult,每个引用不同的ModelAttributes,所以弹簧在 – 2015-04-03 14:05:43

+0

修正了另一个输入错误后立即应用,所以只需要命令* @ ModelAttribute(“user” )@Valid ValidationField validationField,BindingResult结果,Book book * – 2015-04-03 14:08:29