2016-09-06 2 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() никогда не вызывается.

Испытан с весной 4.2.6.RELEASE

+0

Не уверен, что это релевантно, автор в сообщении создал Subscriber.java, в котором у него была ссылка year.clss, но вы используете право @SafeHtml в параметр метода почтового запроса Json. – 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 будет работать в методе контроллера. Он, безусловно, будет работать для @RequestParam и @PathVariable в методе контроллера, когда его запрос на получение.

Для почтовых запросов я считаю, что должен быть POJO-компонент, представляющий тело запроса, а пользовательские аннотации проверки должны быть помещены в атрибуты этого объекта запроса.

В вашем примере в идеале вы должны иметь RequestObj.class с атрибутом JsonNode, и это должно быть аннотировано с помощью @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-компоненты для каждого метода контроллера. – Pleymor

Смежные вопросы