繁体   English   中英

如何配置将应用Spring @ControllerAdvice的控制器?

[英]How to configure which controllers Spring @ControllerAdvice will be applied to?

我的spring应用程序中有两种类型的控制器。

  • 查看转发到视图以生成HTML的控制器
  • 直接从控制器返回JSON的API控制器

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM