2015-03-09 4 views
2

У меня есть проверка в моем приложении, которое использует cookie (request.getCookies) для проверки кода captcha.Получить HttpServletRequest в JSR-303 Проверка Bean

Я хочу создать ConstraintValidator для этой проверки captcha, поэтому он проверяется рядом с атрибутами другого bean-компонента, как указано в JSR-303 Bean Validation.

Есть ли способ получить HttpServletRequest в ConstraintValidator?

ответ

3

Предполагая (из-за данный тег), что у Вас есть весна, с последней версией одного (> = 2.5.1), это должно быть простым, как

package org.yourapp.controller.validation; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.context.support.SpringBeanAutowiringSupport; 

import javax.servlet.http.HttpServletRequest; 
import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

public class YourValidator implements ConstraintValidator<YourValidatorAnnotaion, String> { 
    // here should be autowired a proxy to currently undergoing request 
    @Autowired 
    private HttpServletRequest request; 

    @Override 
    public void initialize(YourValidatorAnnotaion constraintAnnotation) { 
     // this should autowire all dependencies of this class using 
     // current application context 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
     // here goes your custom logic for validation, like matching 
     // captcha challenge to captcha response, but i am not doing 
     // this for you, as i don't know what it supposed to be, so 
     // i simply test presence of cookies. 
     return request.getCookies().length > 0; 
    } 
} 

Для Комплектности, здесь образец @YourValidatorAnnotaion реализация:

package org.yourapp.controller.validation; 

import javax.validation.Constraint; 
import javax.validation.Payload; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

import static java.lang.annotation.ElementType.*; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 

@Constraint(validatedBy = YourValidator.class) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface YourValidatorAnnotaion { 
    String message() default "No cookies - no validation"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

Вот он. Теперь, если вы аннотируете свое поле DTO с помощью @YourValidatorAnnotaion, вы должны получить сообщение об ошибке, когда контроллер с таким аргументом @Valid @RequestBody будет вызываться без файлов cookie в заголовке запроса.

+0

Любой шанс вы могли бы предоставить ссылку для этого? Я тестировал его и, похоже, работает, но реализация 'ConstraintValidator' должна быть потокобезопасной, поскольку их можно повторно использовать. Это не означает, что он может быть потокобезопасным. Благодарю. –