차체에 새 필드 추가 예외 스프링 받침대
Rest spring boot application에서 예외를 처리하려고 합니다.@ControllerAdvices and ResponseEntity를 사용하면 오류를 나타내는 사용자 지정 개체를 반환할 수 있지만, 제가 원하는 것은 기존 예외의 본문에 새 필드를 추가하는 것입니다.
런타임을 상속하는 사용자 지정 예외를 만들었습니다.문자열 목록인 추가 특성이 있는 예외:
@ResponseStatus(HttpStatus.CONFLICT)
public class CustomException extends RuntimeException {
private List<String> errors = new ArrayList<>();
public CustomException(List<String> errors) {
this.errors = errors;
}
public CustomException(String message) {
super(message);
}
public CustomException(String message, List<String> errors) {
super(message);
this.errors = errors;
}
public List<String> getErrors() {
return errors;
}
public void setErrors(List<String> errors) {
this.errors = errors;
}
}
컨트롤러에서 다음과 같은 사용자 지정 예외를 적용합니다.
@GetMapping("/appointment")
public List<Appointment> getAppointments() {
List<String> errors = new ArrayList<>();
errors.add("Custom message");
throw new CustomException("This is my message", errors);
}
우체부와 함께 Rest 끝점을 테스트했을 때 스프링 부트가 내 오류 필드를 마셜하지 않는 것처럼 보입니다. 응답은 다음과 같습니다.
{
"timestamp": "2017-06-05T18:19:03",
"status": 409,
"error": "Conflict",
"exception": "com.htech.bimaristan.utils.CustomException",
"message": "This is my message",
"path": "/api/agenda/appointment"
}
예외에서 "경로" 및 "타임스탬프" 필드를 가져올 수 있지만 이 두 속성에 대한 게터가 없는 경우 @ControllerAdvise를 사용하여 사용자 지정 개체로 이동할 수 있습니다.
감사해요.
다음은 DefaultErrorAttributes의 "경로" 및 "타임스탬프" 구현입니다. 이는 사용자 지정 구현에서도 수행할 수 있습니다.
경로:
String path = getAttribute(requestAttributes, "javax.servlet.error.request_uri");
if (path != null) {
errorAttributes.put("path", path);
}
타임스탬프:
errorAttributes.put("timestamp", new Date());
스프링 부트의 오류 사용자 지정에 대한 설명서는 다음과 같습니다.
@Bean
public ErrorAttributes errorAttributes() {
return new DefaultErrorAttributes() {
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
// customize here
return errorAttributes;
}
};
}
또는 사용자 정의 구현을 작성할 수 있습니다.
@Component
public class CustomErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
// customize here
return errorAttributes;
}
}
그ErrorAttributes
been은 아래의 오류 응답을 사용자 정의합니다.
{
"timestamp": 1413883870237,
"status": 500,
"error": "Internal Server Error",
"exception": "org.example.ServiceException",
"message": "somthing goes wrong",
"path": "/index"
}
그"exception"
속성은 다음을 사용하여 사용자 정의할 수 있습니다.@ExceptionHandler
A @ControlerAdvice
여러 컨트롤러에 걸쳐 예외를 일반적으로 사용자 지정하는 데 사용할 수 있습니다.컨트롤러 수준에서 사용자 지정하기 위해 컨트롤러 내에 배치할 수 있습니다.
당신의 경우:
@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Invalid Inputs")
@ExceptionHandler(CustomException.class)
private void errorHanlder() {
//Log exception
}
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
Throwable error = getError(requestAttributes);
if (error instanceof CustomException) {
errorAttributes.put("errorList", ((CustomException)error).getErrors());
}
return errorAttributes;
}
이전 답은 정말로 모든 것을 포함하고 있지만 어떻게든 이해하는 데 시간이 걸렸습니다. 요약하자면, 이것을 달성하는 가장 간단한 방법은 다음과 같은 콩을 갖는 것입니다.
@Bean
public ErrorAttributes errorAttributes() {
return new DefaultErrorAttributes() {
@Override
public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
boolean includeStackTrace) {
Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
Throwable error = getError(requestAttributes);
if (error instanceof CustomExceptionthere) {
errorAttributes.put("errorList", ((CustomException)error).getErrors());
}
return errorAttributes;
}
};
언급URL : https://stackoverflow.com/questions/44375456/add-new-field-in-body-exception-spring-rest
'source' 카테고리의 다른 글
socket.io 방 또는 네임스페이스? (0) | 2023.07.30 |
---|---|
MSSQL 증분 정수 열이 있는 문 선택...일반적이지 않은 (0) | 2023.07.30 |
히스토그램 산점도 행렬 lib (0) | 2023.07.25 |
MySQL/MariaDB 업데이트 카운터 그룹 기준 (0) | 2023.07.25 |
Panda에서 날짜/시간 형식을 변경하는 방법 (0) | 2023.07.25 |