在Spring控制器中返回未捕获异常的JSON

duk*_*ash 6 java json exception-handling spring-mvc spring-restcontroller

我有一个Spring控制器注释,@RestController它返回JSON.我还有一个带有@ControllerAdvice@ExceptionHandler一些自定义异常相关的s 注释的类.我正在使用Tomcat来提供这个RESTful API.我希望有任何非自定义异常,例如来自第三方库或Nu​​llPointerException的异常被捕获并返回状态500 - 内部服务器错误为JSON,带有消息而不是显示错误的HTML页面.

如果我@ExceptionHandler(Exception.class)在控制器建议中使用它,它将接管所有Spring异常,如MissingPathVariableException.class,这是不理想的.我已经尝试过扩展Sp​​ring的ResponseEntityExceptionHandler,但是这个类没有用@ResponseBody注释,所以不返回JSON.

  1. 如何在不影响Spring内部的情况下在Spring RESTful API中为未捕获和未知异常(无法计划的异常)返回JSON?
  2. 如何完全关闭返回HTML并确保只有JSON响应,无论请求是否有异常?

Mak*_*iuk 5

对于未捕获的异常返回JSON,可以使用以下代码:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

@ControllerAdvice  
@RestController
public class GlobalExceptionHandler {

    private class JsonResponse {
        String message;

        public JsonResponse() {
        }

        public JsonResponse(String message) {
            super();
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }       
    }

    @ExceptionHandler(value = Exception.class)  
    public ResponseEntity<JsonResponse> handleException(Exception e) {
        return new ResponseEntity<JsonResponse>(new JsonResponse(e.getMessage()), HttpStatus.BAD_REQUEST);
    }

}
Run Code Online (Sandbox Code Playgroud)

抛出异常时的JSON结果:

{
    "message": "Something wrong!"
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此链接获取有关Spring异常处理的更多详细信息(带有代码示例)。

  • 我们如何为Spring 3.1.4实现类似的类? (2认同)