- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个错误消息类:
@XmlRootElement
public class ErrorMessage {
private String message;
public ErrorMessage() {
}
public ErrorMessage(String message) {
this.message = message;
}
public String getError() {
return message;
}
public void setError(String message) {
this.message = message;
}
}
此类已作为返回值分配给我的 Spring MVC REST Controller 中的 @ExceptionHandler:
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
ErrorMessage handleException(RuntimeException e) {
return new ErrorMessage("something went wrong");
}
每当客户端在发出带有 application/json
作为 Accept
header 的请求后触发 RuntimeException
时,它都会收到带有正确的响应状态代码和匹配的 JSON 正文:
{"error":"something went wrong"}
或者,如果 Accept
header 是 application/xml
,则接收到 XML 正文:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errorMessage><error>something went wrong</error></errorMessage>
现在,我想通过实现 HandlerExceptionResolver 来生成此解决方案相反,我不必将 @ExceptionHandler
复制/粘贴到每个 Controller (或创建其他 Controller 可以扩展的通用“父 Controller ”)。
然而,AbstractHandlerExceptionResolver.doResolveException()方法返回一个 ModelAndView
而不是我的专有 ErrorMessage
,所以我尝试了以下操作:
public class RuntimeExceptionHandlerExceptionResolver extends AbstractHandlerExceptionResolver {
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
if (ex instanceof RuntimeException) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
ModelAndView mav = new ModelAndView();
mav.addObject("error", "something went wrong");
return mav;
}
return null;
}
}
调试时,我可以看到调用了 mav.addObject()
方法。客户端的响应具有预期的状态代码,但内容类型是 text/html
正文中包含 html,而不是 Accept< 指定的 JSON 或 XLM 内容
原始请求中的 header 。
(旁注,上面示例中的实际异常、响应代码和文本消息并不重要,它们只是作为简单示例。)
Spring 版本:3.1.1.RELEASE
最佳答案
要让 @ExceptionHandler
使用内容协商,AnnotationMethodHandlerExceptionResolver
有一个setMessageConverters()
消息转换器必须提供的方法,例如:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
<property name="messageConverters">
<list>
<ref bean="xmlConverter"/>
<ref bean="jsonConverter"/>
</list>
</property>
</bean>
但是由于您使用的是自定义方法,因此您可能必须自己实现此功能。最简单的方法可能是 Ctrl-C Ctrl-V
来自 AnnotationMethodHandlerExceptionResolver
source ,特别是 handleResponseBody()
方法。
关于java - Spring MVC,将@ExceptionHandler 迁移到 HandlerExceptionResolver 以获得 RESTful 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10885795/
我知道 Exception 是所有异常的父级,但我认为当您为特定异常类设置 @ExceptionHandler 时,它应该处理该特定异常。 也许您可以指出我在以下代码中遗漏的内容,以便 MethodA
我开发了一个 Web 应用程序,其中表单验证异常应该由 @ExceptionHandler 处理(需要灵活),一般系统异常由 SimpleMappingExceptionResolver 处理(执行电
在我的应用程序中,我在 web.xml 中配置了一个错误页面。我需要根据条件覆盖特定 Controller 。在这里,当条件成立时,我需要重定向到特定的错误页面,否则应该呈现正常的错误页面。这是代码。
经过一段时间的研究和尝试不同的事情后,我仍然无法在 jUnit 集成测试中调用我的 @ExceptionHandler。请帮我理解为什么? @RequestMapping(value = "/some
我将在我的 Web 应用程序上引入全局处理程序: @ControllerAdvice public class GlobalControllerExceptionHandler { @Exce
我一直在兜圈子试图修复测试,但 SO 或其他在线资源都没有提供解决方案。我有这个@ControllerAdvice处理 MyException 的方法异常(exception)是: @Controll
这个问题在 Google 领域已被问过几次,但我似乎无法将这些解决方案应用于我的情况。我的 J2EE 应用程序使用 Spring,之前我使用 SimpleMappingExceptionResolve
我正在使用 springmvc 为客户端创建 restful api,我有一个用于检查 accesstoken 的拦截器。 public class AccessTokenInterceptor ex
我的 Controller 中有一个方法可以处理应用程序抛出的异常。所以我有一个这样的方法。 @Controller public class ExceptionController { @R
我使用 @ControllerAdvice 来处理我所有的应用程序异常: @ControllerAdvice public class ExceptionHandlingController {
我正在使用以下代码处理我的受控异常: @ExceptionHandler(MyException.class) @ResponseStatus(HttpStatus.NOT_FOUN
我构建了一个简单的 ExceptionHandler 类: class ExceptionHandler{ public function __construct(){ set
我不知道如何通过@ExceptionHandler 处理一种以上的异常。 我需要以编程方式处理这些异常,为此我需要一个共享引用。这是通过此引用“Exception ex”完成的吗?我不这么认为,因为没
我正在使用默认 AnnotationMethodHandlerAdapter,我认为它应该启用对@ExceptionHandler 的支持。不幸的是,如果调用如下所示的处理程序方法,则会抛出 Serv
我正在使用 spring 的 @ControllerAdvice 和 @ExceptionHandler 进行异常处理。任何方法都会从 Controller 中抛出自定义异常,并由相应的 @Excep
我有一个像 @RestController public class CustomerRestController { @Autowired private CustomerManag
在我的Micronaut应用程序中,我定义了ExceptionHandler,应该捕获WorkflowException并返回状态码为412且主体为HttpResponse的WorkflowExcep
我有这样的异常处理程序: @ControllerAdvice public classMyExceptionHandler extends ResponseEntityExceptionHandler
我在 spring RestController 中有这样的异常处理程序。 @ExceptionHandler(AuthException.class) public ResponseEntit
我遇到问题,然后我 try catch 异常。 这是我的类,它实现了 ResponseErrorHandler: public class ErrorGenerator implements
我是一名优秀的程序员,十分优秀!