簡體   English   中英

使用spring 3 restful以編程方式更改http響應狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM