我有一个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 {}