【问题标题】:Spring: Annotate a method with both @RequestMapping and @ExceptionHandler?Spring:用@RequestMapping 和@ExceptionHandler 注释一个方法?
【发布时间】:2019-07-08 10:07:02
【问题描述】:

我最近偶然发现了一些我以前在这种形式中没有见过的代码。也许这里有人可以帮助我更好地了解发生了什么。

也就是说,我找到了一个用@RequestMapping @ExceptionHandler 注释的方法。我认为前者用于处理请求,而后者用于处理异常,所以我认为通常使用两个注释中的 either,而不是 both同一时间。

我在这里找到了代码 sn-p:https://github.com/shopizer-ecommerce/shopizer/blob/2.5.0/sm-shop/src/main/java/com/salesmanager/shop/store/api/exception/RestErrorHandler.java#L24

代码sn-p是:

@RequestMapping(produces = "application/json")
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public @ResponseBody ErrorEntity handleServiceException(Exception exception) {
    log.error(exception.getMessage(), exception);
    ErrorEntity errorEntity = createErrorEntity(null, exception.getMessage(),
                                                exception.getLocalizedMessage());
    return errorEntity;
}

我有两个问题:

  1. 根据Spring documentation on @RequestMapping@RequestMapping 方法的未注释方法参数(不是某些特殊类型)被隐式注释为@ModelAttribute(参见“任何其他参数” 在上述链接下的表格末尾)。那么在上面的代码sn-p中,Exception参数是不是也隐式地用@ModelAttribute注释了呢?如果是,这有意义吗?
  2. @RequestMapping@ExceptionHandler 来注释方法通常有意义吗(例如,同时处理请求和异常),还是这样的形式不好?

【问题讨论】:

  • 这里 @RequestMapping 用于仅定义响应类型而不用于请求 url 映射,@ExceptionHandler 用于清除 Exception 类的映射,因此如果在应用程序中的任何位置,任何控制器方法都会抛出异常这个方法会执行。

标签: java spring spring-mvc request-mapping


【解决方案1】:

好问题。 我会说试试这个。在控制器上,采取两种方法。在一种方法上,仅使用 RequestMethod 并通过从页面接受模型属性来编写代码。 在此方法上,为 NullPointerException 创建一个场景。

在方法 2 上,同时注释 RequestMapping 和 ExceptionHandler。从方法一到方法二,你可以看到你是否得到了请求,ModelAttributes的响应。

如果是,那么这将帮助我们评估异常并处理我们需要模型属性值的无效场景。

根据您上面粘贴的解释,ModelAttribute 对 RequestMapping 是隐含的,而不是对控制器方法上的所有注释。

请告诉我们。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2016-02-15
    • 2018-02-23
    • 2023-03-24
    相关资源
    最近更新 更多