오류 발생시 json 형태의 커스텀한 객체를 던지고 싶다.
예외처리시 오류 코드와 오류 메시지는 enum 클래스를 활용한다.
케이스별 예외에 대한 정의를 enum 으로 정의 한다.
public enum ServiceError {
BIND_ERROR(){
@Override
public ResultError getResultError() {
String message = getMessage();
return ResultError.builder()
.httpStatus(HttpStatus.BAD_REQUEST)
.resultCode("40000")
.resultMessage(StringUtils.isEmpty(message) ? "Binding Error." : message)
.build();
}
},
EMAIL_ALREADY_EXIST(){
@Override
public ResultError getResultError() {
return ResultError.builder()
.httpStatus(HttpStatus.BAD_REQUEST)
.resultCode("40001")
.resultMessage("Email Already")
.build();
}
},
PHONE_ALREADY_EXIST(){
@Override
public ResultError getResultError() {
return ResultError.builder()
.httpStatus(HttpStatus.BAD_REQUEST)
.resultCode("40002")
.resultMessage("Phone number is already exit.")
.build();
}
},
NO_SUCH_USER(){
@Override
public ResultError getResultError() {
return ResultError.builder()
.httpStatus(HttpStatus.NOT_FOUND)
.resultCode("40003")
.resultMessage("Not such user.")
.build();
}
};
private String message;
public abstract ResultError getResultError();
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
예외처리 클래스를 상속받아 구현 한 후 위의 serviceError enum 클래스타입으로 사용한다.
public class ServiceException extends RuntimeException{
private static final long serialVersionUID = -7165609979529099309L;
private final ServiceError serviceError;
public ServiceException(ServiceError serviceError) {
super();
this.serviceError = serviceError;
}
public ServiceException(ServiceError serviceError, String message) {
super(message);
this.serviceError = serviceError;
}
public ServiceException(ServiceError serviceError, String message, Throwable cause) {
super(message, cause);
this.serviceError = serviceError;
}
public ServiceException(ServiceError serviceError, Throwable cause) {
super(cause);
this.serviceError = serviceError;
}
public ServiceError getServiceError() {
return serviceError;
}
}예외처리 에서 예외를 던질때 정의한 타입으로 던지도록 (enum class) 한다.
try {// 비즈니스 로직 혹은 서버 오류 혹은 디비에러 등등
} catch (ServiceError e) {
log.error("[service] Error {}",e);ServiceError.BIND_ERROR.setMessage("describe error");
throw new ServiceException(ServiceError. BIND_ERROR, e);
}
Rest Api로 오류 내용을 전달하도록 커스텀 객체를 만든다.
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class ResultError{
@JsonIgnore
private HttpStatus httpStatus;
@JsonProperty(required = true)
private String resultCode;
@JsonProperty(required = true)
private String resultMessage;
}컨트롤러에서 예외발생시 예외케이스별로 httpstatucode, payload{resultcode,resultmessage} 를 정의하여 던지도록 한다.
@RestControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler(ServiceException.class)
public ResponseEntity<?> responseException(ServiceException e){
ResultError err = e.getServiceError().getResultError();
return new ResponseEntity<>(err,err.getHttpStatus());
}
// 오류코드 외의 예외 처리는 오버라이드 하여 구현 하도록 한다.
}
'SpringBoot' 카테고리의 다른 글
Object List groupping and sorted by fields (0) | 2019.01.09 |
---|---|
자바 - 시작_종료 시간 사이 체크 (0) | 2018.10.08 |
Spring boot jar 파일 Linux 서버 실행 등록 하기 (0) | 2018.09.12 |
java 8 remove duplicate object in List (0) | 2018.09.12 |
Send Global sms with AWS SMS (0) | 2018.08.23 |