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:
编辑:我的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项目中解决的问题。
-
将
mvc:annotation-driven
添加到您的applicatonContext.xml中 -
在控制器中添加以下代码:
@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 。
- 如何区分任务管理器进程列表中的进程列表中的不同JavaWS应用程序?
- 在Servlet中使用org.json会导致java.lang.ClassNotFoundException:org.json.JSONException
- 如何使用solrj 4.9.0提取stats组件
- Hibernate,spring,JPS和隔离 – 不支持自定义隔离
- 如何使用GSON解码字符串对列表?
- 使用’PlatformUI.getWorkbench()。restart()’重启Eclipse不会重启RCP产品
- 如何使用iText在所有文档页面中显示数字PDF签名?
- 如何在Glassfish 2.1中设置env变量
- 如何使用Java在PostgreSQL中安全地转义SQL的任意字符串