Abh*_*kar 5 spring hibernate-validator bean-validation
我按照文档(http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html)中的内容配置了一个JSR-303自定义验证器,类路径上的LocalValidatorFactoryBean和Hibernate验证器.但是,我的验证器只是拒绝启动.我在这里提出了一个简单的测试项目(https://github.com/abhijitsarkar/java/tree/master/spring-jsr-303),以及一个故障单元测试.如果你决定看看,只需克隆它并gradlew clean test从根目录运行
.我正在使用Spring framework 4.0.2.RELEASE和Hibernate验证器5.0.3.Final.
验证方法:
public Coffee serve(@ValidOrder(Coffee.Blend.class) final String blend) {
Run Code Online (Sandbox Code Playgroud)
ValidOrder注释:
@Documented
@Constraint(validatedBy = {OrderValidator.class})
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,
ElementType.FIELD,
ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR,
ElementType.PARAMETER})
@NotNull
public @interface ValidOrder {
Run Code Online (Sandbox Code Playgroud)
OrderValidator验证器:
public class OrderValidator implements ConstraintValidator<ValidOrder, String> {
Run Code Online (Sandbox Code Playgroud)
Spring配置:
@Configuration
@ComponentScan(basePackages = "name.abhijitsarkar.coffeehouse")
@EnableAspectJAutoProxy
public abstract class AppConfig {
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
Run Code Online (Sandbox Code Playgroud)
依赖关系:
dependencies {
compile(
[group: 'javax.inject', name: 'javax.inject', version: injectApiVersion],
[group: 'javax.validation', name: 'validation-api', version: beanValidationApiVersion],
[group: 'javax.annotation', name: 'javax.annotation-api', version: annotationApiVersion],
[group: 'org.springframework', name: 'spring-beans', version: springVersion],
[group: 'org.springframework', name: 'spring-context', version: springVersion],
[group: 'org.springframework', name: 'spring-aop', version: springVersion],
[group: 'org.aspectj', name: 'aspectjrt', version: aspectjVersion]
)
runtime(
[group: 'org.hibernate', name: 'hibernate-validator', version: hibernateValidatorVersion],
[group: 'javax.el', name: 'javax.el-api', version: elVersion],
[group: 'org.glassfish.web', name: 'javax.el', version: glassfishElVersion],
[group: 'org.aspectj', name: 'aspectjweaver', version: aspectjVersion]
)
Run Code Online (Sandbox Code Playgroud)
Abh*_*kar 20
要验证的类必须在其@Validated上有注释,否则不会搜索方法内联约束注释.
@Configuration
@ComponentScan(basePackageClasses = {SpringPackageComponentScanMarker.class})
@EnableAspectJAutoProxy
public abstract class AppConfig {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
@Bean
public LocalValidatorFactoryBean validator() {
final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
return localValidatorFactoryBean;
}
}
Run Code Online (Sandbox Code Playgroud)...
@Service
@Validated
public class SpringBarista extends Barista {
Run Code Online (Sandbox Code Playgroud)
讨论与JSR-303集成的参考手册的一部分很方便地省略了这两个关键点,没有BV没有启动.这只是让我进行了6个小时的调试和头发撕裂,我做了医生说的所有事情,但BV只是我不得不通过Spring源代码调试来理解这一点.必须有一个更简单的方法,我不能成为唯一有这个问题的人.为他们创建了一个JIRA SPR-11473来更新文档.