Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to I get Spring-Data-MongoDB to validate my objects?

Tags:

I have a very simple Spring Boot application that uses Spring-Data-Mongodb

All I want to do is set a JSR-303 validation rule that says the object I'm saving must have a username. I read that JSR-303 was added to spring-data-mongodb in version 1.1 so I assumed that when I save an object it's validated but this isn't the case.

Does anyone have a simple example setup that shows how this works?

My User pojo looks like

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);     } } 

I saw somewhere that validation only kicks in if you have a validator created in the context so I tried updating my Application class (which contains all the configuration, to look like

@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);     }  } 
like image 242
Zac Tolley Avatar asked Mar 21 '14 20:03

Zac Tolley


People also ask

Can I use Spring data JPA with MongoDB?

Yes, DataNucleus JPA allows it, as well as to many other databases. You make compromises by using the JPA API for other types of datastores, but it makes it easy to investigate them.

How does a Spring Validator work?

Spring features a Validator interface that you can use to validate objects. The Validator interface works using an Errors object so that while validating, validators can report validation failures to the Errors object.


1 Answers

First make sure that you have JSR-303 validator on classpath, for example:

<dependency>     <groupId>org.hibernate</groupId>     <artifactId>hibernate-validator</artifactId>     <version>4.2.0.Final</version> </dependency> 

If you use Java config, the way to go is to create 2 beans:

@Bean public ValidatingMongoEventListener validatingMongoEventListener() {     return new ValidatingMongoEventListener(validator()); }  @Bean public LocalValidatorFactoryBean validator() {     return new LocalValidatorFactoryBean(); } 

Voilà! Validation is working now.

like image 107
Maciej Walkowiak Avatar answered Sep 18 '22 19:09

Maciej Walkowiak