我仍然是 Spring Boot 的新手,但我有一個 Web 應用程式,它被設定為處理 XML 請求(當請求具有“內容型別:應用程式/xml”標頭時,或 JSON 請求時(當請求具有“Content-type: application/xml”標頭),我注意到如果“Content-type”標頭丟失或包含“Content-type: application/xml”或“Content-type: application/ json”,我收到“415”回應錯誤代碼。日志記錄還顯示如下訊息:
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded' not supported]
我找到了這個較舊的 SO 執行緒:
Springboot 例外處理程式不捕獲例外
并且一直在嘗試實施“Sannu”于 2016 年 12 月 17 日 13:55 發布的代碼。這是我構建并正在測驗的代碼(作為測驗,我試圖將錯誤回應代碼更改為“500”并且還有一條錯誤回應訊息):
import org.apache.logging.log4j.LogManager;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
import mil.nga.geoaxis.pdp.models.ErrorResponse;
import org.springframework.http.HttpStatus;
@ControllerAdvice
public class SpringExceptionHandler extends ExceptionHandlerExceptionResolver
{
@ExceptionHandler(org.springframework.web.HttpMediaTypeNotSupportedException.class)
public ResponseEntity<Object> handleControllerException(HttpMediaTypeNotSupportedException ex, WebRequest req)
{
ErrorResponse errorResponse = null;
//ex.printStackTrace();
errorResponse = new ErrorResponse();
errorResponse.setCode(HttpCodes.HTTP_CODE_INTERNAL_ERROR);
System.out.println("In SpringExceptionHandler.handleControllerException: HttpStatus.INTERNAL_SERVER_ERROR.value()=[" HttpStatus.INTERNAL_SERVER_ERROR.value() "]");
System.out.println("In SpringExceptionHandler.handleControllerException: ex.getMessage()=[" ex.getMessage() "]");
int myCode = errorResponse.getCode();
System.out.println("In SpringExceptionHandler.handleControllerException: errorResponse.getCode()/String.valueOf(myCode)=[" String.valueOf(myCode) "]");
errorResponse.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
errorResponse.setMessage(ex.getMessage());
myCode = errorResponse.getCode();
System.out.println("In SpringExceptionHandler.handleControllerException: errorResponse.getCode()/String.valueOf(myCode)=[" String.valueOf(myCode) "]");
return new ResponseEntity<Object>(errorResponse, HttpStatus.valueOf(errorResponse.getCode()));
}
}
但是,當我測驗并發送沒有“Content-type:”標頭的請求(使用 curl)時,我仍然收到看似帶有“100”回應代碼的回應,然后是帶有“415”回應的回應代碼,并且沒有回應訊息。
僅供參考,這是出現的日志記錄的一部分:
In SpringExceptionHandler.handleControllerException: HttpStatus.INTERNAL_SERVER_ERROR.value()=[500]
In SpringExceptionHandler.handleControllerException: ex.getMessage()=[Content type 'application/x-www-form-urlencoded' not supported]
In SpringExceptionHandler.handleControllerException: errorResponse.getCode()/String.valueOf(myCode)=[0]
In SpringExceptionHandler.handleControllerException: errorResponse.getCode()/String.valueOf(myCode)=[500]
WARN 15428 --- [io-18443-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler ....errorhandling.SpringExceptionHandler#handleControllerException(HttpMediaTypeNotSupportedException, WebRequest)
誰能建議為什么這似乎無法發送錯誤代碼和回應訊息?
[僅供參考,我在 Spring Boot 2.5.6 下執行此操作。]
提前致謝!
吉姆
編輯 1:我根據 huy 的建議修改了課程:
import org.apache.logging.log4j.LogManager;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
@ControllerAdvice
public class SpringExceptionHandler
{
@ExceptionHandler(org.springframework.web.HttpMediaTypeNotSupportedException.class)
public ResponseEntity handleControllerException(HttpMediaTypeNotSupportedException ex, WebRequest req)
{
ErrorResponse errorResponse = null;
//ex.printStackTrace();
errorResponse = new ErrorResponse();
//errorResponse.setCode(HttpCodes.HTTP_CODE_INTERNAL_ERROR);
System.out.println("In SpringExceptionHandler.handleControllerException: HttpStatus.INTERNAL_SERVER_ERROR.value()=[" HttpStatus.INTERNAL_SERVER_ERROR.value() "]");
System.out.println("In SpringExceptionHandler.handleControllerException: ex.getMessage()=[" ex.getMessage() "]");
int myCode = errorResponse.getCode();
System.out.println("In SpringExceptionHandler.handleControllerException: errorResponse.getCode()/String.valueOf(myCode)=[" String.valueOf(myCode) "]");
errorResponse.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
errorResponse.setMessage(ex.getMessage());
myCode = errorResponse.getCode();
System.out.println("In SpringExceptionHandler.handleControllerException: errorResponse.getCode()/String.valueOf(myCode)=[" String.valueOf(myCode) "]");
return ResponseEntity
.status(HttpStatus.valueOf(415))
.body(ex.getMessage());
}
}
The code above causes a response with error code 415, and the text error message from the HttpMediaTypeNotSupportedException exception.
uj5u.com熱心網友回復:
您不需要擴展 ExceptionHandlerException...,它默認用于解決錯誤。
你只需要 ControllerAdvice 和 ExceptionHandler,ExceptionHandlerExceptionResolver 會自動掃描注解 ExceptionHandler 并處理它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/372540.html
標籤:java spring-boot
下一篇:從物件串列中列印出棋盤
