Spring portlet mvc:@Valid似乎不起作用

我创建了一个bean类并在我的控制器中使用它,但它似乎不起作用。 即使我输入无效年龄, result.hasErrors仍然是假的。

Bean类:

 public class User{ @Min(13) private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName(){ return name; } public void setName(String name){ this.name = name; } } 

控制器片段:

 @ActionMapping(params = "myAction=validateUser") public void validateUser(ActionRequest request, ActionResponse response, ModelMap model, @ModelAttribute("user") @Valid User user, BindingResult result ){ if(result.hasErrors()){ for(ObjectError oe : result.getAllErrors()){ System.out.println(oe.getDefaultMessage()); } } else{ //code } } 

JSP:

 
User

编辑:我的userRegistration-portlet.xml:

                 

这是mvc:spring-validation行给出的: cvc-complex-type.2.4.c the matching wildcard is strict, but no declaration can be found for the element mvc:annotation-driven. 错误。

您需要来启用jsr-303validation。 如果您由于某种原因不想使用它,或者在某些时候它开始产生问题(就像它对我做的那样),请看看这个问题

更新:在schemaLocation ,mvc条目应包含以下两个

 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 

我有完全相同的问题。 我阅读https://jira.springframework.org/browse/SPR-6817并通过添加到我的配置来解决问题:

            

您还需要在项目中使用JSR-303validation器以使其可用为此我使用了Hibernate Validator: http : //www.hibernate.org/subprojects/validator.html

您需要执行以下操作,这就是我在spring portlet mvc项目中解决的问题。

  1. mvc:annotation-driven添加到您的applicatonContext.xml中

  2. 在控制器中添加以下代码:

    @Autowired private LocalValidatorFactoryBean validator;

    @InitBinder public void initBinder(WebDataBinder binder) { binder.setValidator(validator); }

我认为原因是ServletRequestDataBinder (扩展DataBinder)没有org.springframework.validation.Validator实例,所以它不validation任何东西(要validation@Valid带注释的bean,你必须有javax.validation.Validator实例)。

org.springframework.validation.DataBinder

  public void validate() { Validator validator = getValidator(); if (validator != null) { validator.validate(getTarget(), getBindingResult()); } } 

您可以在@InitBinder注释方法中设置Validator实例: –

 @InitBinder public void initBinder(WebDataBinder binder) { binder.setValidator(new MyValidator()); } 

Yo还可以在WebBindingInitializer中设置validation器实例。

StandardBindingInitializer

  public class StandardBindingInitializer implements WebBindingInitializer { @Autowired private LocalValidatorFactoryBean validator; public void setValidatorFactory(LocalValidatorFactoryBean validator) { this.validator = validator; } @Override public void initBinder(WebDataBinder binder, WebRequest request) { binder.setValidator(validator); } } 

要创建LocalValidatorFactoryBean的实例,请使用mvc:annotation-driven或将LocalValidatorFactoryBean设置为bean 。