Spring boot starter data rest, @Notnull constraint not working

12,258

Solution 1

I had the same problem, but just enabling validation didn't work for me, this did work with both JPA and MongoDb to save anyone else spending ages on this. Not only does this get validation working but I get a nice restful 400 error rather than the default 500.

Had to add this to my build.gradle dependencies

    compile('org.hibernate:hibernate-validator:4.2.0.Final')

and this config class

@Configuration
public class CustomRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {


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

   @Override
   public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
       validatingListener.addValidator("afterCreate", validator());
       validatingListener.addValidator("beforeCreate", validator());
       validatingListener.addValidator("afterSave", validator());
       validatingListener.addValidator("beforeSave", validator());
   }
}

Solution 2

i found it better to make my own version of @NotNull annotation which validates empty string as well.

@Documented
@Constraint(validatedBy = NotEmptyValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotEmpty {


    String message() default "{validator.notEmpty}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

public class NotEmptyValidator implements ConstraintValidator<NotEmpty, Object> {

    @Override
    public void initialize(NotEmpty notEmpty) { }

    @Override
    public boolean isValid(Object obj, ConstraintValidatorContext cxt) {
        return obj != null && !obj.toString().trim().equals("");
    }

}
Share:
12,258
oxyt
Author by

oxyt

Updated on June 14, 2022

Comments

  • oxyt
    oxyt almost 2 years

    I am trying to add @NotNull constraint into my Person object but I still can @POST a new Person with a null email. I am using Spring boot rest with MongoDB.

    Entity class:

    import javax.validation.constraints.NotNull;
    
    public class Person {
        @Id 
        private String id;
        private String username;
        private String password;
        @NotNull // <-- Not working
        private String email;
        // getters & setters
    }
    

    Repository class:

    @RepositoryRestResource(collectionResourceRel = "people", path = "people")
    public interface PersonRepository extends MongoRepository<Person, String> {
    }
    

    Application class:

    @SpringBootApplication
    public class TalentPoolApplication {
        public static void main(String[] args) {
            SpringApplication.run(TalentPoolApplication.class, args);
        }
    }
    

    pom.xml

    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.BUILD-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    ...
    

    When I @POST a new object via Postman like:

    {
      "username": "deadpool",
      "email": null
    }
    

    I still get STATUS 201 created with this payload:

    {
        "username": "deadpool",
        "password": null,
        "email": null
         ....
         ....
    }