[英]Programmatically change http response status using spring 3 restful
我有一個像下面這樣的控制器
@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.但我需要根據錯誤類型設置動態錯誤Http狀態代碼,如500,403等。 我該怎么做呢?
您需要更改輸出值ResponseEntity的類型。 在這里回答: 如何在返回String的Spring MVC @ResponseBody方法中響應HTTP 400錯誤?
我得到一個解決方案,並分享這個,也想知道任何好的建議。
@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"
}
謝謝你的回復。 我仍然需要指導好的做法。
按照上面的代碼,你需要更加小心你要拋出和處理的異常。 為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。
您可以為API使用Aspect。 如果為服務定義@Around攔截器,則可以更改響應內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.