不调用自定义JSR 303验证

时间:2013-04-01 07:42:49

标签: spring spring-mvc

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

我的春季配置

<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在classpath中。

请看我错过了什么?

更新:更新了处理程序方法以包含POST请求类型和消耗,生成值。还包括我的带有JSON数据的http请求。

1 个答案:

答案 0 :(得分: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);
}