1

我有一个像这样的异常处理程序,它将产生一个 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 方法中,我明确设置了生成值。

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

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

4

1 回答 1

0

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

但是您的用例是有效的——事实上,这个问题已经在即将发布的 Spring 4.0 版本中得到解决(参见SPR-10222)。

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

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

于 2013-10-22T12:29:57.483 回答