2013-04-01 66 views
2

我的自定义JSR 303验证未被调用。这里是我的代码未调用自定义JSR 303验证

我的Spring配置有

<mvc:annotation-driven /> 

我的控制器的处理方法:

@RequestMapping(value="update", method = RequestMethod.POST , 
       consumes="application/json" , 
       produces="application/json")) 
@ResponseBody 
public String update(@Valid @RequestBody MyBean myBean){ 
    return process(myBean); 
} 

为myBean(标注有ValidMyBeanRequest):

@ValidMyBeanRequest 
public class MyBean { 

    private int id; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

ValidMyBeanRequest annotaion:

@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类:

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; 
    } 
} 

我的HTTP POST请求低于JSON数据:

{id:100} 

问题是MyBeanValidator的isValid是没有得到调用。我使用的是Spring 3.1.0,HibernateValidator在类路径中。

请看我在想什么?

更新:更新的处理程序方法包含POST请求类型并消耗,产生值。还包括我的http请求与JSON数据。

+0

'是否为非标准约束和正常@ valid'工作(表单)命令对象(没有'@ RequestBody')? – Ralph

+0

另外,myBean绑定正确吗? – n1ckolas

+0

@ n1ckolas myBean绑定正确。我有json映射;如果字段映射不正确,我会发生错误。 – Vinay

回答

1

假设你确实得到了模型,在这种情况下,你做的都是正确的,除了一件事:你需要手动处理你的验证结果。

为了实现这一点,你需要添加BindingResult对象插入到处理程序的参数列表,然后在路上的过程验证约束你想:

@RequestMapping(value="update") 
@ResponseBody 
public String update(@Valid @ModelAttribute @RequestBody MyBean myBean, BindingResult result) { 
    if (result.hasErrors()){ 
     return processErrors(myBean); 
    } 
    return process(myBean); 
} 
+0

感谢您的回复。我不想绑定结果并检查它是否有错误。我的控制器中实际上有一个@ExceptionHandler批注的方法来捕获任何验证异常。然而,当我添加BindingResult时,我收到一个异常:'java.lang.IllegalStateException: 声明的错误/ BindingResult参数没有先前的模型属性' – Vinay

+0

这个异常表明你需要为'MyBean'添加'@ ModelAttribute'(已经更新在答案中)。对于'ExceptionHandler':你可以尝试@ Validated'注解,比如:'String update(@Validated @RequestBody MyBean myBean){...' – n1ckolas

+0

嗨n1ckolas,'@ Validated'没有帮助。如果我添加@ @ ModelAttribute'我收到错误。 'java.lang.IllegalStateException:Handler参数注释是排他性的选择 - 不要在同一个参数上指定多个这样的注解。 **但我的问题是没有处理验证错误。我的验证器根本没有被调用**。我在isValid中有一些调试语句没有执行。 – Vinay