2016-09-06 53 views
0

我跟着本教程创建自定义的验证: http://codetutr.com/2013/05/29/custom-spring-mvc-validation-annotations/定制验证控制器上的方法

而且根据这一条,有可能验证请求aguments与JSR-303的验证注解: 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 {}; 
} 

定制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

+0

不知道它是否相关,作者在帖子中创建了一个Subscriber.java,其中包含year.clss引用,但是您正在使用@SafeHtml权限Json post请求方法的参数。 – Zeus

回答

2

如果你不想一切的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 
    } 

} 
+0

这正是我需要的! – Pleymor

0

测试,我不知道是否与自定义验证(@SafeHtml)到@RequestBody参数注释将在控制器方法工作。当它的get请求时,它肯定会用于控制器方法中的@RequestParam和@PathVariable。

对于post请求,我认为应该有一个代表请求体的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结构会相应更改。

+0

是的,但在这个项目中,许多控制器没有DTO(POJO beans),这就是我为什么要这么做的原因。 如果这是不可能的,我将不得不为每种控制器方法创建POJO bean。 – Pleymor