[SPRING] 스프링 3을 사용하여 프로그래밍 방식으로 HTTP 응답 상태 변경
SPRING스프링 3을 사용하여 프로그래밍 방식으로 HTTP 응답 상태 변경
나는 아래 컨트롤러를 가지고있다.
@Controller("myController")
@RequestMapping("api")
public class MyController {
@RequestMapping(method = RequestMethod.GET, value = "/get/info/{id}", headers = "Accept=application/json")
public @ResponseBody
Student getInfo(@PathVariable String info) {
.................
}
@ExceptionHandler(Throwable.class)
@ResponseStatus( HttpStatus.EXPECTATION_FAILED)
@ResponseBody
public String handleIOException(Throwable ex) {
ErrorResponse errorResponse = errorHandler.handelErrorResponse(ex);
return errorResponse.toString();
}
}
컨트롤러에는 오류 처리 메커니즘이 있습니다. 오류 처리 옵션에서 항상 기대 상태 코드 417을 반환합니다. 그러나 오류 유형에 따라 500, 403 등의 동적 오류 HTTP 상태 코드를 설정해야합니다. 어떻게해야합니까?
해결법
-
==============================
1.ResponseEntity 출력 유형의 유형을 변경해야합니다. 답변 : 문자열을 반환하는 Spring MVC @ResponseBody 메서드에서 HTTP 400 오류로 응답하는 방법?
ResponseEntity 출력 유형의 유형을 변경해야합니다. 답변 : 문자열을 반환하는 Spring MVC @ResponseBody 메서드에서 HTTP 400 오류로 응답하는 방법?
-
==============================
2.나는 해결책을 얻었고 이것을 공유하고 또한 좋은 제안을 알고 싶다.
나는 해결책을 얻었고 이것을 공유하고 또한 좋은 제안을 알고 싶다.
@Controller("myController") @RequestMapping("api") public class MyController { @RequestMapping(method = RequestMethod.GET, value = "/get/info/{id}", headers = "Accept=application/json") public @ResponseBody Student getInfo(@PathVariable String info) { // ... } } // ... @ExceptionHandler(Throwable.class) //@ResponseStatus( HttpStatus.EXPECTATION_FAILED)<<remove this line @ResponseBody public String handleIOException(HttpServletResponse httpRes,Throwable ex){ // <<Change this if (some condition) { httpRes.setStatus(HttpStatus.BAD_GATEWAY.value()); } else { httpRes.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } ErrorResponse errorResponse = errorHandler.handleErrorResponse(ex); return errorResponse.toString(); }
휴식 클라이언트에서 예상 :
502 Bad Gateway { "status":"BAD_GATEWAY", "error":"java.lang.UnsupportedOperationException", "message":"Some error message" }
답장을 보내 주셔서 감사합니다. 좋은 관행을위한 조언이 필요합니다.
-
==============================
3.위의 코드를 살펴보면, 던지고 처리중인 예외에 대해 더주의해야합니다. Throwable에 대한 예외 처리기를 설정하는 것은 지나치게 광범위하게 보입니다.
위의 코드를 살펴보면, 던지고 처리중인 예외에 대해 더주의해야합니다. Throwable에 대한 예외 처리기를 설정하는 것은 지나치게 광범위하게 보입니다.
이 방법은 내 XML / JSON 마샬링 주석을 사용하여 ErrorMessage 클래스를 만드는 것입니다.
@XmlRootElement(name = "error") public class ErrorMessage { private Throwable exception; private String message; public ErrorMessage() { this.message = ""; } public ErrorMessage(String message) { this.message = message; } public ErrorMessage(Throwable exception) { this.exception = exception; this.message = exception.getLocalizedMessage(); } @XmlTransient @JsonIgnore public Throwable getException() { return exception; } public void setException(Throwable exception) { this.exception = exception; } @XmlElement(name = "message") public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
그 자리에, 나는 내 자신의 응용 프로그램 예외를 만들고 다음과 같은 예외 처리기 메서드를 만드는 경향이 있습니다.
@ExceptionHandler(ResourceNotFoundException.class) @ResponseBody @ResponseStatus(HttpStatus.NOT_FOUND) public ErrorMessage handleResourceNotFoundException(ResourceNotFoundException e, HttpServletRequest req) { return new ErrorMessage(e); } @ExceptionHandler(InternalServerErrorException.class) @ResponseBody @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorMessage handleInternalServerErrorException(InternalServerErrorException e, HttpServletRequest req) { return new ErrorMessage(e); }
그러한 것들을 사용하면 컨트롤러 메소드에서 적절한 예외를 던질 필요가 있습니다. 예를 들어, ResourceNotFoundException을 던지면 Spring은이를 handleResourceNotFoundException 메소드로 리디렉션합니다.이 메소드는 404를 반환하고 JSON 또는 오류를 나타내는 XML도 반환합니다.
-
==============================
4.API에 대해 Aspect를 사용할 수 있습니다. 서비스에 대해 @Around 인터셉터를 정의하면 응답 내용을 변경할 수 있습니다.
API에 대해 Aspect를 사용할 수 있습니다. 서비스에 대해 @Around 인터셉터를 정의하면 응답 내용을 변경할 수 있습니다.
from https://stackoverflow.com/questions/20067057/programmatically-change-http-response-status-using-spring-3-restful by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 하위 메서드에서 예외가 발생할 때 트랜잭션에 대해서만 롤백 없음 (0) | 2019.04.20 |
---|---|
[SPRING] setBundle을 사용해로드 된 프로퍼티 파일의 재로드 (0) | 2019.04.20 |
[SPRING] 테스트 컨텍스트에 대한 @Transactional 테스트를 위해 PlatformTransactionManager를 검색하는 데 실패했습니다. (0) | 2019.04.20 |
[SPRING] 트랜잭션, JavaConfig에 대해 Hibernate Session을 열 수 없음 (0) | 2019.04.20 |
[SPRING] 스프링의 validator가 데이터베이스에 액세스해야합니까? (0) | 2019.04.20 |