Spring MVC:在@ExceptionHandler 上的@RequestStatus 中获取 i18n 消息原因
Spring MVC: Get i18n message for reason in @RequestStatus on a @ExceptionHandler
我有一个 Spring 启动应用程序,其中 Thymeleaf 混合了获取视图和 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
原因替换为相应的文本,例如 "An unexpected error happened" 这样我就可以在 UI 在我的 javascript fail() 方法中以防出现未处理的错误。
任何关于如何做到这一点的线索将不胜感激。谢谢!
如果您将异常处理程序放入 类 并用 @ControllerAdvice
注释,您可以通过指定 annotation
属性来配置此建议以匹配特定的控制器。
在您的情况下,只需为 @Controller
和 @RestController
创建单独的建议,并为每个建议创建具有不同逻辑的异常处理程序:
@ControllerAdvice(annotations = RestController.class)
class RestAdvice {
@ExceptionHandler
...
}
@ControllerAdvice(annotations = Controller.class)
class MvcAdvice {
@ExceptionHandler
...
}
我选择了 Maciej 的回答,但我还需要做一些额外的事情。
首先,我必须将此 @ControllerAdvice
的优先级设置为 1,以避免异常被另一个获取(因为 RestController
扩展了 Controller
)。
其次,我必须对其进行注释 @ResponseBody
以确保我的处理程序的 return 值将被 return 编辑为 REST 响应。
@ControllerAdvice(annotations = RestController.class)
@Priority(1)
@ResponseBody
public class RestControllerAdvice {}
@ControllerAdvice(annotations = Controller.class)
@Priority(2)
public class MvcControllerAdvice {}
我有一个 Spring 启动应用程序,其中 Thymeleaf 混合了获取视图和 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
原因替换为相应的文本,例如 "An unexpected error happened" 这样我就可以在 UI 在我的 javascript fail() 方法中以防出现未处理的错误。
任何关于如何做到这一点的线索将不胜感激。谢谢!
如果您将异常处理程序放入 类 并用 @ControllerAdvice
注释,您可以通过指定 annotation
属性来配置此建议以匹配特定的控制器。
在您的情况下,只需为 @Controller
和 @RestController
创建单独的建议,并为每个建议创建具有不同逻辑的异常处理程序:
@ControllerAdvice(annotations = RestController.class)
class RestAdvice {
@ExceptionHandler
...
}
@ControllerAdvice(annotations = Controller.class)
class MvcAdvice {
@ExceptionHandler
...
}
我选择了 Maciej 的回答,但我还需要做一些额外的事情。
首先,我必须将此 @ControllerAdvice
的优先级设置为 1,以避免异常被另一个获取(因为 RestController
扩展了 Controller
)。
其次,我必须对其进行注释 @ResponseBody
以确保我的处理程序的 return 值将被 return 编辑为 REST 响应。
@ControllerAdvice(annotations = RestController.class)
@Priority(1)
@ResponseBody
public class RestControllerAdvice {}
@ControllerAdvice(annotations = Controller.class)
@Priority(2)
public class MvcControllerAdvice {}