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



我有一个Spring引导应用程序,其中Thymelaf混合了获取视图的普通Controller调用和REST异步调用。对于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原因替换为基于用户区域设置的相应文本,例如"发生了意外错误",以便在出现未处理错误时,我可以在Javascript fail()方法的UI中显示该原因。

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

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

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

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

我选择了Maciej的答案,但我还需要做一些额外的事情。首先,我必须将优先级1设置为这个@ControllerAdvice,以避免另一个异常(因为RestController扩展了Controller)。其次,我必须将其注释为@ResponseBody,以确保我的处理程序的返回值将作为REST响应返回。

@ControllerAdvice(annotations = RestController.class)
@Priority(1)
@ResponseBody
public class RestControllerAdvice {}
@ControllerAdvice(annotations = Controller.class)
@Priority(2)
public class MvcControllerAdvice {}

最新更新