我的自定义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请求。
答案 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);
}