Spring @ExceptionHandler - 仅适用于生成@RequestMapping的json

时间:2013-07-23 22:57:02

标签: spring spring-mvc

我有一个像这样的异常处理程序,它会产生一个json错误对象,供javascript在视图中使用。

@ControllerAdvice
public class ExceptionHandlerController {


    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public final JsonResponse<Void> handleJsonException(
            final Exception e,
            final HttpServletRequest request,
            final HttpServletResponse response) {
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return new ErrorJsonResponse(e);
    }

}

我不希望此方法针对常规回发(非json)请求运行。所以我想通过WEB.XML配置的错误页面处理这些异常。

<error-page>
    <error-code>500</error-code>
    <location>/500</location>
</error-page>

在我返回json的@RequestMapping方法中,我明确设置了yield值。

@RequestMapping(value = "/dosomething",
        method = RequestMethod.POST,
        produces = MediaType.APPLICATION_JSON_VALUE)

如何告诉spring根据产生内容类型使用特定的异常处理程序?

1 个答案:

答案 0 :(得分:0)

@ControllerAdvice带注释的类可以帮助应用程序中的所有已知控制器。开发人员通常使用特定的业务/技术异常将ExceptionHandler限制为某些情况;在这种情况下,Exception.class过于宽泛。

但是你的用例是有效的 - 实际上,这个问题已经解决(参见SPR-10222)即将发布的Spring 4.0版本。

例如,您可以使用@ControllerAdvice(annotations = RestController.class)注释RestExceptionHandlerController - 假设您的REST控制器使用@RestController注释(注释暗示@ResponseBody所有方法!)。

但是,这个新功能不依赖于MediaTypes(在运行时协商,具体取决于客户端的请求),而是依赖于注释,assignabletypes,包,基本包类......我认为这些可以帮助您构建{{1带注释的类。