mongodb - query - spring mongorepository
¿Cómo obtengo Spring-Data-MongoDB para validar mis objetos? (3)
Tengo una aplicación Spring Boot muy simple que usa Spring-Data-Mongodb
Todo lo que quiero hacer es establecer una regla de validación JSR-303 que diga que el objeto que estoy guardando debe tener un nombre de usuario. Leí que JSR-303 se agregó a spring-data-mongodb en la versión 1.1, así que asumí que cuando guardo un objeto está validado, pero este no es el caso.
¿Alguien tiene una configuración de ejemplo simple que muestra cómo funciona esto?
Mi usuario pojo se parece a
public class User {
@Id
private String id;
@NotNull(message = "User Name is compulsory")
private String userName;
private String password;
public User() {}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = PasswordAuthService.hash(password);
}
}
Vi en algún lado que la validación solo aparece si tienes un validador creado en el contexto, así que traté de actualizar mi clase de aplicación (que contiene toda la configuración, para que se vea como
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
@Bean
public Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
return validator;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Primero asegúrese de tener el validador JSR-303 en classpath, por ejemplo:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
Si usa la configuración de Java, el camino a seguir es crear 2 beans:
@Bean
public ValidatingMongoEventListener validatingMongoEventListener() {
return new ValidatingMongoEventListener(validator());
}
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
Voilà! La validación está funcionando ahora.
Agregar un Validator
al contexto es un buen primer paso, pero no creo que interactúe con nada a menos que así lo solicite. Los chicos de Spring Data probablemente puedan decirlo con certeza, pero creo que también debes declarar explícitamente a algunos oyentes. Hay un blog antiguo sobre la función , pero puedes encontrarlo haciendo búsquedas en Google tan fácilmente como pueda.
Si crees que habría una función de autoconfig útil en Spring Boot , no dudes en hacer una propuesta detallada sobre github.
Encontré que si agrego
public User addUser(@RequestBody @Valid User newUser,
BindingResult bindingResult) throws Exception {
if (bindingResult.hasErrors()) {
throw new Exception("Validation Error");
}
Para mi controlador esto valida el json entrante en contra de mis reglas, aunque aún debería intentar configurar el validatingMongoEventListener para interceptar cualquier otra parte de mi código que intente actualizar el modelo con datos no válidos.