我有一个像这样的异常处理程序,它会产生一个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根据产生内容类型使用特定的异常处理程序?
答案 0 :(得分:0)
@ControllerAdvice
带注释的类可以帮助应用程序中的所有已知控制器。开发人员通常使用特定的业务/技术异常将ExceptionHandler限制为某些情况;在这种情况下,Exception.class
过于宽泛。
但是你的用例是有效的 - 实际上,这个问题已经解决(参见SPR-10222)即将发布的Spring 4.0版本。
例如,您可以使用@ControllerAdvice(annotations = RestController.class)
注释RestExceptionHandlerController - 假设您的REST控制器使用@RestController
注释(注释暗示@ResponseBody
所有方法!)。
但是,这个新功能不依赖于MediaTypes(在运行时协商,具体取决于客户端的请求),而是依赖于注释,assignabletypes,包,基本包类......我认为这些可以帮助您构建{{1带注释的类。