복붙노트

[SPRING] 스프링 부트 스타터 데이터 휴식, @Notnull 제약 조건이 작동하지 않음

SPRING

스프링 부트 스타터 데이터 휴식, @Notnull 제약 조건이 작동하지 않음

Person 객체에 @NotNull 제약 조건을 추가하려고하지만 null 전자 메일을 사용하여 새 Person을 @POST 할 수 있습니다. MongoDB에서 Spring 부트 레스트를 사용하고 있습니다.

엔티티 클래스 :

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
}

저장소 클래스 :

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

신청 종류 :

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

Pom.hml

...
<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>
...

Postman을 통해 @POST 새로운 객체를 만들 때 :

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

STATUS 201이 페이로드로 생성됩니다.

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

해결법

  1. ==============================

    1.나는 똑같은 문제가 있었지만 유효성 확인을 사용하는 것이 나에게 효과가 없었습니다. JPA와 MongoDb 모두에서 이것에 오래 머무르는 다른 사람을 구하기 위해이 방법을 사용했습니다. 이 작업은 유효성 검사를 수행 할뿐만 아니라 기본 500보다 400 회의 오류가 발생하기 쉽습니다.

    나는 똑같은 문제가 있었지만 유효성 확인을 사용하는 것이 나에게 효과가 없었습니다. JPA와 MongoDb 모두에서 이것에 오래 머무르는 다른 사람을 구하기 위해이 방법을 사용했습니다. 이 작업은 유효성 검사를 수행 할뿐만 아니라 기본 500보다 400 회의 오류가 발생하기 쉽습니다.

    이것을 build.gradle 의존성에 추가해야했습니다.

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

    및이 구성 클래스

    @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());
       }
    }
    
  2. ==============================

    2.빈 문자열의 유효성을 검사하는 @NotNull 주석의 자체 버전을 만드는 것이 더 좋습니다.

    빈 문자열의 유효성을 검사하는 @NotNull 주석의 자체 버전을 만드는 것이 더 좋습니다.

    @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("");
        }
    
    }
    
  3. ==============================

    3.다음 코드를 사용하여 유효성을 검사 할 수 있습니다.

    다음 코드를 사용하여 유효성을 검사 할 수 있습니다.

    @Configuration
    @Import(value = MongoAutoConfiguration.class)
    public class DatabaseConfiguration extends AbstractMongoConfiguration 
    {
    
      @Resource
      private Mongo mongo;
    
      @Resource
      private MongoProperties mongoProperties;
    
      @Bean
      public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
      }
    
      @Bean
      public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
      }
    
      @Override
      protected String getDatabaseName() {
        return mongoProperties.getDatabase();
      }
    
      @Override
      public Mongo mongo() throws Exception {
        return mongo;
      }
    
    }
    
  4. from https://stackoverflow.com/questions/36649331/spring-boot-starter-data-rest-notnull-constraint-not-working by cc-by-sa and MIT license