Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 未调用自定义JSR 303验证_Spring_Spring Mvc - Fatal编程技术网

Spring 未调用自定义JSR 303验证

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

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

我的spring配置

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