oil*_* ID 8 validation spring dependency-injection
所以我的示例测试项目将显示完整的相关配置和代码:
约束注释:
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FooValidator.class)
public @interface FooValid {
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)
注释PoJo:
public class Foo {
@FooValid(message = "Test failed")
private Integer test;
[...]
}
Run Code Online (Sandbox Code Playgroud)
使用@Validated进行带注释的服务:
@Service
@Validated
public class FooService {
private final Test test;
@Autowired
public FooService(final Test test) {
this.test = test;
}
public void foo(@Valid final Foo foo) {
this.test.test(foo);
}
}
Run Code Online (Sandbox Code Playgroud)
JSR-303 ConstraintValidator:
public class FooValidator implements ConstraintValidator<FooValid, Integer> {
@Autowired
private ValidationService validationService;
@Override
public void initialize(final FooValid constraintAnnotation) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(final Integer value, final ConstraintValidatorContext context) {
// this.validationService is always NULL!
Assert.notNull(this.validationService, "the validationService must not be null");
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
注入的ValidationService:
@Service
public class ValidationService {
public void test(final Foo foo) {
System.out.println(foo);
}
}
Run Code Online (Sandbox Code Playgroud)
Spring启动应用程序和配置:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(final String[] args) {
final ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
final FooService service = context.getBean(FooService.class);
service.foo(new Foo());
}
@Bean
public static LocalValidatorFactoryBean validatorFactory() {
return new LocalValidatorFactoryBean();
}
@Bean
public static MethodValidationPostProcessor validationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
Run Code Online (Sandbox Code Playgroud)
相关的maven pom:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.9.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>demo.Application</start-class>
<java.version>1.7</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
我正在使用LocalValidatorFactoryBean和默认的SpringConstraintValidatorFactory.但是为什么依赖注入不能在ConstraintValidator中工作并且ValidationService无法自动装配?
顺便说一下,如果我不在服务中使用@Validated,请在spring或javax Validator接口的对面注入并手动调用" validator.validate "依赖注入将起作用.但我不想手动调用每个服务中的validate方法.
非常感谢帮助:)
小智 9
我在Spring Boot环境中遇到了同样的问题,我发现Hibernate的内部实现已经进入,而不是配置Spring的.当应用程序启动时,调试器在Spring的工厂中找到了一条线,但后来在运行时出现了Hibernate的一个.经过一些调试后,我得出结论,MethodValidationPostProcessor得到了内部的一个.因此我配置如下:
@Bean
public Validator validator() {
return new LocalValidatorFactoryBean();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
Run Code Online (Sandbox Code Playgroud)
注意验证器的setter - 它完成了这项工作.
小智 0
我遇到过同样的问题。问题的出现是因为 Hibernate 正在寻找并应用验证器,而不是 Spring。NONE所以在配置Hibernate时需要将验证模式设置为:
@Bean(name="entityManagerFactory")
public LocalContainerEntityManagerFactoryBean
localContainerEntityManagerFactoryBean(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean lcemfb =
new LocalContainerEntityManagerFactoryBean();
lcemfb.setDataSource(dataSource);
lcemfb.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
lcemfb.setValidationMode(ValidationMode.NONE);
// Continue configuration...
Run Code Online (Sandbox Code Playgroud)
如果您配置了 LocalValidationFactoryBean,Spring 将选取任何带有注释的验证器@Component并自动装配它们。
| 归档时间: |
|
| 查看次数: |
8272 次 |
| 最近记录: |