La inyección de dependencia en el validador de restricciones JSR-303 con Spring falla
Tengo el mismo problema queaquí yaquí pero no pude encontrar una solución todavía.
Entonces, mi proyecto de prueba de muestra mostrará toda la configuración y el código relevantes:
Anotación de restricción:
@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 {};
}
PoJo anotado:
public class Foo {
@FooValid(message = "Test failed")
private Integer test;
[...]
}
Servicio anotado con @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);
}
}
Validador de restricción JSR-303:
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;
}
}
Servicio de Validación Inyectado:
@Service
public class ValidationService {
public void test(final Foo foo) {
System.out.println(foo);
}
}
Aplicación de arranque de primavera y configuración:
@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();
}
}
pom maven relevante:
<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>
Estoy usando elLocalValidatorFactoryBean con el valor predeterminadoSpringConstraintValidatorFactory. Pero, ¿por qué la inyección de dependencia no funciona en ConstraintValidator y elValidationService no se pudo conectar automáticamente?
Por cierto si no uso@Validado en el servicio, inyecte en la interfaz de Spring o Java Validator y llame manualmente "validator.validate"la inyección de dependencia funcionará. Pero no quiero llamar al método de validación en cada servicio manualmente.
Muchas gracias por la ayuda :)