Dependency Injection im JSR-303 Constraint Validator mit Spring schlägt fehl
Ich habe das gleiche Problem wieHie undHie konnte aber noch keine Lösung finden.
So zeigt mein Beispieltestprojekt die gesamte relevante Konfiguration und den Code:
Einschränkungsannotation:
@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 {};
}
Annotated PoJo:
public class Foo {
@FooValid(message = "Test failed")
private Integer test;
[...]
}
Annotated Service with @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);
}
}
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;
}
}
Injected ValidationService:
@Service
public class ValidationService {
public void test(final Foo foo) {
System.out.println(foo);
}
}
Spring Boot-Anwendung und Konfiguration:
@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();
}
}
relevant 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>
Ich benutze das LocalValidatorFactoryBean mit dem Standardwert SpringConstraintValidatorFactory. Aber warum funktioniert die Abhängigkeitsinjektion im ConstraintValidator und im @ nich ValidationService konnte nicht automatisch verkabelt werden?
Übrigens, wenn ich @ nicht benut@Bestätig Im Servicefall, spritzen Sie in das gegenüberliegende Spring- oder Javax-Validator-Interface und rufen Sie manuell " validator.validate "Die Abhängigkeitsinjektion funktioniert. Ich möchte die Validierungsmethode jedoch nicht in jedem Dienst manuell aufrufen.
Vielen Dank für die Hilfe:)