Предполагая (из-за данный тег), что у Вас есть весна, с последней версией одного (> = 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 в заголовке запроса.
Любой шанс вы могли бы предоставить ссылку для этого? Я тестировал его и, похоже, работает, но реализация 'ConstraintValidator' должна быть потокобезопасной, поскольку их можно повторно использовать. Это не означает, что он может быть потокобезопасным. Благодарю. –