programing

스프링 부트 프로젝트에서 휴지 상태 검증을 비활성화하는 방법

golfzon 2023. 3. 25. 12:03
반응형

스프링 부트 프로젝트에서 휴지 상태 검증을 비활성화하는 방법

Crud Repository, 엔티티 및 컨트롤러가 있는 스프링 부트 프로젝트가 있습니다.기본적으로 컨트롤러에게 전달된 데이터를 기반으로 엔티티를 유지하려고 합니다.

이렇게 하기 위해 저는spring-boot-starter-jpa. My Entity에는 JSR-303 주석이 추가되어 있습니다.이 주석들은 데이터가 CrudRepository에 전달되기 전에 컨트롤러에서 체크됩니다.

컨트롤러 방식:

@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
    if (validation.hasErrors()) {
        throw new ValidationException(validation);
    }
    User saved = this.users.save(user);
    return new SuccessfulResponse<User>(saved);
}

엔티티:

@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name="email_address", nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}

제 문제의 원인은UserUnique주석입니다.검증자는 다음과 같습니다.

public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

   private UserRepository users;

   @Autowired
   public UserUniqueValidator(UserRepository users) {
       this.users = users;
   }

   @Override
   public void initialize(UserUnique annotation) {}

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
       return users.findOne(value) == null;
   }
}

검증이 두 번 실행되고 있는 것 같습니다.를 경유하여 컨트롤러에 접속하면@Valid주석 및 휴지 상태가 개체를 유지하려고 할 때 한 번 표시됩니다.그러나 휴지 상태가 개체를 유지하려고 하면 다음과 같이 느려집니다.

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`

이는 스프링을 인식하지 못하고 컨스트럭터에 종속성을 주입할 수 없기 때문으로 보입니다.따라서, Hibernate 검증을 완전하게 무효로 합니다(컨트롤러내에서 이미 장황하게 행해지고 있기 때문에).

이 건물에는 다음과 같은 자산이 있는 것 같습니다.javax.persistence.validation.mode설정할 수 있습니다.none다만, 코드 베이스의 설정에서는, 아무리 생각해도 어디에 설정할지를 알 수 없습니다.

JSR-303 의존성 주입이나 휴지 상태등의 질문이 있는 것은 알고 있습니다만, 모두 xml 설정을 사용하고, 퍼시스텐스 레이어의 일부를 수동으로 설정하고 있습니다.

Spring Boot에 의해 생성되는 퍼시스턴스 레이어의 필요한 부분을 '사후 구성'하는 작업을 수행합니다.스프링 부트의 자동 구성을 사용할 수 없게 되기 때문입니다.1) 이것이 가능한지, 2) 어떤 부품을 어떻게 구성해야 하는지 결정하는 데 도움을 주실 수 있습니까?

감사합니다!

[M. Deinum]이 제 원래 투고 코멘트에서 언급했듯이 해결책은 다음과 같습니다.

spring.jpa.properties.javax.persistence.validation.mode=none

에서application.properties파일.

또, 이 동작에 대해서도 설명합니다(예가 없기 때문에 놓치기 쉽습니다).

@Erin Drummond's Answer는 데이터베이스 엔티티 검증(개별 레코드)에 대한 답변입니다.

그러나 누군가 스키마 검증에 문제가 생겼을 경우 아래 속성은 정상적으로 작동합니다.

# Hibernate ddl auto (create, create-drop, validate, update, none)
spring.jpa.hibernate.ddl-auto=none

실제로 스프링 부츠 2.x에서는 다음과 같습니다.

spring.jpa.hibernate.ddl-auto: none

검증 의존성을 추가하지 않으면 스프링 검증이 실행되지 않습니다.

 <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>

언급URL : https://stackoverflow.com/questions/26764532/how-to-disable-hibernate-validation-in-a-spring-boot-project

반응형