복붙노트

[SPRING] 스프링 레스트의 ConstraintViolationException

SPRING

스프링 레스트의 ConstraintViolationException

내 예외 처리를위한 다음 봄 휴식 컨트롤러가 있습니다.

@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody
ExceptionResponseDTO hiberAnnotationExceptionHandler(ConstraintViolationException exception) {
    return  new ExceptionResponseDTO("Entity is null or we are out of range!", exception.getMessage(), ExceptionMapper.INSTANCE.exceptionToExceptionDTO(exception));
}

내 엔티티 클래스 :

@Entity
public class Device {

    @Id
    @Column(name="name", nullable = false)
    private String Name;

    @Column(name = "send_date")
    @NotNull
    private Date sendDate;
}

ConstraintViolationException을 에뮬레이트하려고합니다. 따라서 컨트롤러에서 다음 코드를 사용합니다.

Device d = new Device();
d.setName("sdsdsd");
d.setSendDate(null);
deviceRepository.save(d);

결과적으로 다음 예외가 발생합니다.

그래서 stacktrace에서 볼 수 있듯이 먼저 TransactionSystemException을받습니다.이 때문에 ExceptionHandler 메서드 (hiberAnnotationExceptionHandler)가 호출되지 않습니다. 그래서 내 질문에이 예외 (ConstraintViolationException) 에뮬레이트하는 방법입니다? 미리 감사드립니다.

해결법

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

    1.TransactionSystemException의 이유

    TransactionSystemException의 이유

    코드 AbstractEntityManagerImpl.convert () 메소드 안에 들어가면, 기본적으로 ConstraintViolation과 같은 특정 예외를 처리하지 않는 대신 PersistenceException을 던지고 감싸는 것을 볼 수 있습니다.

    예외를 정확하게 해결하는 솔루션

    HibernateJpaDialect는 이러한 예외를 잡아 내고 다음과 같은 스프링 특정 예외로 변환한다.

  2. ==============================

    2.다음 단계를 재현 해보십시오.

    다음 단계를 재현 해보십시오.

    해당 엔티티를 사용하려는 경우. 다음과 같이하십시오.

    @Valid @RequestBody Device device 
    

    당신의 방법으로. 이전 단계를 건너 뛸 수 있습니다.

  3. from https://stackoverflow.com/questions/32052092/constraintviolationexception-in-spring-rest by cc-by-sa and MIT license