11

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

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

API 和 View 控制器都是同一个 spring dispatcher servlet 的一部分。Spring 3.2 引入了@ControllerAdvice注解以允许全局位置处理异常。

该文档暗示@ControllerAdvice将应用于与 Dispatcher Servlet 关联的每个控制器。

有没有办法配置哪些控制器@ControllerAdvice将适用?

例如,在我的场景中,我想要一个@ControllerAdvice用于我的视图控制器并@ControllerAdvice为我的 API 控制器分开。

4

5 回答 5

6

对于仍然会发现这个问题的人:

从 Spring 4 开始,ControlerAdvice 可以限制为具有指定注释的 Controler。看一眼:

http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring.html

(本文后半部分)了解更多详情。

于 2014-02-14T00:35:13.943 回答
4

更新

我正在使用 spring 4。您可以执行以下 2 个选项之一。

(1) 你可以添加你想要的包。(在这些包中,您有要遵循的控制器@ControllerAdvice)。

前任:

@ControllerAdvice(basePackages={"my.pkg.a", "my.pkg.b"})

(2) 你可以直接添加你想要的控制器类。

前任:

@ControllerAdvice(basePackageClasses={MyControllerA.class, MyControllerB.class})
于 2018-07-20T10:53:25.460 回答
3

我认为现在不可能。如果您可以让 API 和 View 控制器抛出不同的异常类型,那么您可以定义两个不同的 @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。请参阅春季论坛上的此线程。

希望能帮助到你。

于 2013-01-27T10:24:37.157 回答
3

您的例外不应决定您的回复的内容类型。而是检查请求的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");
}
于 2013-06-18T18:35:47.577 回答
1
@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()...
于 2013-04-07T15:53:46.993 回答