2

我的自定义 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 注释:

@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 请求类型和消费,产生值。还包括我的带有 JSON 数据的 http 请求。

4

1 回答 1

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);
}
于 2013-04-01T09:09:10.837 回答