![](/img/trans.png)
[英]Spring MVC Controllers Unit Test not calling @ControllerAdvice
[英]How to configure which controllers Spring @ControllerAdvice will be applied to?
我的spring应用程序中有两种类型的控制器。
API控制器和视图控制器都是同一个Spring调度程序servlet的一部分。 Spring 3.2引入了@ControllerAdvice
批注,允许全局位置处理异常。
该文档暗示@ControllerAdvice
将应用于与Dispatcher Servlet关联的每个控制器。
有没有办法配置@ControllerAdvice
将应用于哪些控制器?
例如,在我的场景中,我想为我的View控制器提供一个@ControllerAdvice
,并为我的API控制器分离@ControllerAdvice
。
对于仍会发现此问题的人:
从Spring 4开始,ControlerAdvice可以限制为带有指定注释的Controler。 看一眼:
http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring.html
(本文后半部分)了解更多详情。
我认为现在不可能。 如果你可以让API和View控制器抛出不同的Exception类型,那么你可以定义两个不同的@ExceptionHandler并实现你想要的。
// For handling API Exceptions
@ExceptionHandler(APIException.class) // Single API Exception
@ExceptionHandler({APIException.class, ..., ,,,}) // Multiple API Exceptions
// For handling View Exceptions
@ExceptionHandler(ViewException.class) // Single View Exception
@ExceptionHandler({ViewException.class, ..., ...}) // Multiple View Exceptions
您可以使用aop将来自API的异常转换为标准的APIException。 在spring论坛上查看此主题 。
希望能帮助到你。
您的例外情况不应决定您的回复的内容类型。 而是检查请求的Accept
标头以了解浏览器的期望。
@ExceptionHandler(Throwable.class)
public @ResponseBody String handleThrowable(HttpServletRequest request, HttpServletResponse response, Throwable ex) throws IOException {
...
String header = request.getHeader("Accept");
if(supportsJsonResponse(header)) {
//return response as JSON
response.setContentType(JSON_MEDIA_TYPE.toString());
return Json.stringify(responseMap);
} else {
//return as HTML
response.setContentType("text/html");
}
UPDATE
我正在使用弹簧4.您可以选择以下两个选项之一。
(1)您可以添加所需的包。 (在那些包中你有你想要跟随@ControllerAdvice
控制器)。
例如:
@ControllerAdvice(basePackages={"my.pkg.a", "my.pkg.b"})
(2)您可以直接添加所需的控制器类。
例如:
@ControllerAdvice(basePackageClasses={MyControllerA.class, MyControllerB.class})
@ExceptionHandler(value=Exception.class)
public ModelAndView error(Exception ex) {
return new ModelAndView("redirect:/error/m");
}
...//ErrorController
@RequestMapping(value = "/m", produces="text/html")
public ModelAndView error()...
@RequestMapping(value = "/m", produces="application/json")
@ResponseBody
public Map errorJson()...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.