Spring MVC:在@ExceptionHandler上的@RequestStatus中获取原因的i18n消息


问题内容

我有一个带有Thymeleaf的Spring
Boot应用程序,混合了获取视图和REST异步调用的常规Controller调用。对于REST异步调用中的错误处理,我希望能够提供一个属性作为异常处理的原因,并使其由MessageSource自动转换。

我的处理程序如下。

@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "general.unexpected.exception")
public ModelAndView handleUnexpectedException(Exception exception) {
    logger.error(exception.getMessage(), exception);
    return createModelAndView("error"); 
}

当在常规控制器调用中发生错误时,将显示错误视图。但是,如果是Javascript
REST调用,我希望能够general.unexpected.exception根据用户区域设置将原因替换为相应的文本,例如“发生意外错误”,因此我可以在UI中的javascript
fail()方法中显示该原因未处理错误的情况。

任何有关如何做到这一点的线索将不胜感激。谢谢 !


问题答案:

如果将异常处理程序放入带有注释的类中@ControllerAdvice,则可以通过指定annotation属性来配置此建议以匹配特定的控制器。

在您的情况下,只需为@Controller@RestController和异常处理程序创建单独的建议,并为每个处理程序使用不同的逻辑即可:

@ControllerAdvice(annotations = RestController.class)
class RestAdvice {
    @ExceptionHandler
    ...
}

@ControllerAdvice(annotations = Controller.class)
class MvcAdvice {
    @ExceptionHandler
    ...
}