Controller方法的自定义验证器

时间:2016-09-06 13:51:21

标签: java spring validation spring-mvc

我按照本教程创建自定义验证器: http://codetutr.com/2013/05/29/custom-spring-mvc-validation-annotations/

根据这个,可以使用JSR-303验证注释验证请求aguments: https://raymondhlee.wordpress.com/2015/08/29/validating-spring-mvc-request-mapping-method-parameters/

我的自定义ConstraintValidator永远不会被调用。这是我的代码:

控制器:

@RestController
@RequestMapping(value = "/json")
@Validated
public class JsonResource {

    @RequestMapping(method = POST, consumes=APPLICATION_JSON_VALUE"))
    public void postJson(@SafeHtml @RequestBody JsonNode jsonQuery){
        // post a foo
    }

}

SafeHtml注释:

@Documented
@Constraint(validatedBy = {SafeHtmlJsonValidator.class})
@Target( {ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SafeHtml {

    String message() default "{SafeHtml}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Custom ConstraintValidator:

@Component
public class SafeHtmlJsonValidator implements ConstraintValidator<SafeHtml, JsonNode> {

    @Override
    public void initialize(SafeHtml constraintAnnotation) {}

    @Override
    public boolean isValid(JsonNode value, ConstraintValidatorContext context) {
        // validate my JSON

        return true;
    }
}

问题是永远不会调用SafeHtmlJsonValidator.isValid()

使用Spring 4.2.6.RELEASE

进行测试

2 个答案:

答案 0 :(得分:7)

如果您不想将所有内容转换为DTO,可以添加MethodValidationPostProcessor

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
    return new MethodValidationPostProcessor();
}

允许您直接向方法字段添加验证注释

喜欢

@RestController
@RequestMapping(value = "/json")
@Validated
public class JsonResource {

    @RequestMapping(method = POST, consumes=APPLICATION_JSON_VALUE"))
    public void postJson(@SafeHtml @RequestBody JsonNode jsonQuery){
        // post a foo
    }

}

答案 1 :(得分:0)

我不确定在@RequestBody参数上使用自定义验证(@SafeHtml)进行注释是否可以在控制器方法中使用。当它是一个get请求时,它肯定适用于控制器方法中的@RequestParam和@PathVariable。

对于帖子请求,我认为应该有一个代表请求体的POJO bean,自定义验证注释应该放在这个请求对象的属性上。

在你的例子中,理想情况下你应该有一个带有属性JsonNode的RequestObj.class,这应该用@SafeHtml注释。

由于您已经在控制器的类级别注释了@Validated,因此控制器方法将是

@RequestMapping(method = POST, consumes=APPLICATION_JSON_VALUE"))
public void postJson(@RequestBody RequestObj requestBody){
    // post a foo
}

和RequestObj.class将有

@SafeHtml
private JsonNode jsonQuery;
//getters,setters...

这应该触发自定义验证器。值得一试。请注意,您的请求json结构将相应更改。