[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.TransactionSystemException의 이유
TransactionSystemException의 이유
코드 AbstractEntityManagerImpl.convert () 메소드 안에 들어가면, 기본적으로 ConstraintViolation과 같은 특정 예외를 처리하지 않는 대신 PersistenceException을 던지고 감싸는 것을 볼 수 있습니다.
예외를 정확하게 해결하는 솔루션
HibernateJpaDialect는 이러한 예외를 잡아 내고 다음과 같은 스프링 특정 예외로 변환한다.
-
==============================
2.다음 단계를 재현 해보십시오.
다음 단계를 재현 해보십시오.
해당 엔티티를 사용하려는 경우. 다음과 같이하십시오.
@Valid @RequestBody Device device
당신의 방법으로. 이전 단계를 건너 뛸 수 있습니다.
from https://stackoverflow.com/questions/32052092/constraintviolationexception-in-spring-rest by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Batch - String을 파일에서 Date로 변환하는 방법은 무엇입니까? (0) | 2019.02.24 |
---|---|
[SPRING] Spring Hibernate 템플릿을 사용할 때 중복을 탐지하는 가장 좋은 방법 (0) | 2019.02.24 |
[SPRING] 봄 부팅 외부 log4j 파일 항아리? (0) | 2019.02.24 |
[SPRING] 스프링 데이터 레스트 (SDR) 버그? 영속 엔티티 null 일 필요는 없습니다. (0) | 2019.02.24 |
[SPRING] 석영 관련 코드를 삭제 한 후에도 Tomcat 서버의 메모리 누수 오류 (0) | 2019.02.24 |