Spring 未调用自定义JSR 303验证
未调用我的自定义JSR 303验证。这是我的密码 我的spring配置Spring 未调用自定义JSR 303验证,spring,spring-mvc,Spring,Spring Mvc,未调用我的自定义JSR 303验证。这是我的密码 我的spring配置 <mvc:annotation-driven /> MyBean(用ValidMyBeanRequest注释): ValidMyBeanRequest注释: @Target({ TYPE }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {MyBeanValidator.class}) public @interface ValidMyBe
<mvc:annotation-driven />
MyBean(用ValidMyBeanRequest注释):
ValidMyBeanRequest注释:
@Target({ TYPE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {MyBeanValidator.class})
public @interface ValidMyBeanRequest {
String message() default "{validMyBeanRequest.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
问题是MyBeanValidator的isValid未被调用。我使用的是Spring3.1.0,HibernateValidator位于类路径中
请看我错过了什么
更新:更新处理程序方法,以包括POST请求类型和消费、生成值。还包括我的带有JSON数据的http请求。假设您正确地获取了模型,在这种情况下,您做的一切都是正确的,除了一件事:您需要手动处理验证结果 为了实现这一点,您需要将对象添加到处理程序参数列表中,然后按照您希望的方式处理验证约束:
@RequestMapping(value="update")
@ResponseBody
public String update(@Valid @ModelAttribute @RequestBody MyBean myBean, BindingResult result) {
if (result.hasErrors()){
return processErrors(myBean);
}
return process(myBean);
}
@valid
是否适用于标准约束和正常(表单)命令对象(不含@RequestBody
)?另外,myBean
是否正确绑定?@n1ckolas myBean是否正确绑定。我有json映射;如果字段映射不正确,我可能会出错。谢谢回复。我不想绑定结果并检查它是否有错误。实际上,我的控制器中有一个@ExceptionHandler注释的方法来捕获任何验证异常。但是,当我添加BindingResult时,我遇到了一个异常:java.lang.IllegalStateException:Errors/BindingResult参数声明时没有前面的模型属性
。此异常表明,您需要为MyBean
添加@ModelAttribute
(已在答案中更新)。对于ExceptionHandler
:您可以尝试@Validated
注释,类似于:字符串更新(@Validated@RequestBody-MyBean-MyBean){…
你好,n1ckolas,@Validated
没有帮助。如果我添加@modeldattribute
我会出错。java.lang.IllegalStateException:处理程序参数注释是排他选择-不要在同一个参数上指定多个这样的注释
。但我的问题不是处理验证错误。我的有效ator根本没有被调用。我在isValid中有一些调试语句没有被执行。第二个异常意味着,您试图在同一个处理程序中传递多于2个@modeldattribute
。这可能是问题的原因,因为我在本地尝试了您的输入数据,并且所有操作都正常。因此,您可能会布莱需要添加更多信息。感谢您的时间@n1ckolas。请查看我帖子上的更新。
@Target({ TYPE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {MyBeanValidator.class})
public @interface ValidMyBeanRequest {
String message() default "{validMyBeanRequest.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class MyBeanValidator implements
ConstraintValidator<ValidMyBeanRequest, MyBean> {
@Override
public void initialize(ValidMyBeanRequest constraintAnnotation) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(MyBean myBean, ConstraintValidatorContext context) {
boolean isValid = true;
int id = myBean.getId();
if(id == 0){
isValid = false;
}
return isValid;
}
}
{id:100}
@RequestMapping(value="update")
@ResponseBody
public String update(@Valid @ModelAttribute @RequestBody MyBean myBean, BindingResult result) {
if (result.hasErrors()){
return processErrors(myBean);
}
return process(myBean);
}