在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 如何只改動Spring Boot RestController在exceptio

如何只改動Spring Boot RestController在exception情況下輸出內(nèi)容的部分字段,而不改寫整個(gè)響應(yīng)內(nèi)容

Spring BootWeb API, 因?yàn)轫?xiàng)目簡單,并不想引入引入一套自己的錯(cuò)誤規(guī)則,直接讓@RestController直接返回repository的查詢結(jié)果,異常的話就使用默認(rèn)的異常結(jié)果

// 正確
{
    "id": 2,
    "text": "hahahahaha",
    "username": "haha",
    "update_time": 1510896551177
}

// 異常
{
    "timestamp": 1510914077779,
    "status": 405,
    "error": "Method Not Allowed",
    "exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
    "message": "Request method 'DELETE' not supported",
    "path": "/api/message/"
}

// 使用@NotNull、@NotBlank和@valid驗(yàn)證參數(shù)錯(cuò)誤的時(shí)候
{
    "timestamp": 1510914681866,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.validation.BindException",
    "errors": [
        {
        
            ...
            
            "defaultMessage": "message不能為空",
            
            ...
        }
    ],
}

這里的status、error內(nèi)容就是當(dāng)前的http狀態(tài)碼,用http狀態(tài)碼和defaultMessage?的內(nèi)容展示異常就夠了,所以希望把無關(guān)的內(nèi)容去掉,統(tǒng)一成

// 正確

{
    "status": 405,
    "error": defaultMessage | error
}

可以如何實(shí)現(xiàn)

我在@ControllerAdvice這個(gè)類里重寫輸出的話,http狀態(tài)碼又會變回200,也不知道如何保留異常的狀態(tài)碼

回答
編輯回答
笨笨噠

做一個(gè)ErrorAttributes的bean就行了,比如這個(gè)例子。

我還有一篇文章

2017年8月22日 19:09
編輯回答
祈歡
@ControllerAdvice
public class GobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler
    // 返回的 HTTP 狀態(tài)碼為 HttpStatus.BAD_REQUEST
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    // 處理某個(gè)具體的異常
    public RespCode handleBindException(BindException ex) {
        return RespCode.errorOf(ex.getFieldError().getDefaultMessage());
    }

    @ResponseBody
    @ExceptionHandler
    // 返回的 HTTP 狀態(tài)碼為 HttpStatus.INTERNAL_SERVER_ERROR
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    // 處理全局異常
    public RespCode handleException(Exception ex) {
        ex.printStackTrace(System.err);
        return RespCode.errorOf(ex.getMessage());
    }

}

這樣寫的 GobalExceptionHandler 會替你處理所有的異常,你可以在 handleException 方法中寫上你的邏輯,并返回你想要返回狀態(tài)碼和數(shù)據(jù)。

2017年8月19日 08:34