Java Spring MVC,将@ExceptionHandler迁移到RESTful服务的HandlerExceptionResolver 背景
我有一个错误消息类:Java Spring MVC,将@ExceptionHandler迁移到RESTful服务的HandlerExceptionResolver 背景,java,spring,rest,spring-mvc,content-type,Java,Spring,Rest,Spring Mvc,Content Type,我有一个错误消息类: @XmlRootElement public class ErrorMessage { private String message; public ErrorMessage() { } public ErrorMessage(String message) { this.message = message; } public String getError() { return mess
@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控制器中@ExceptionHandler的返回值:
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
ErrorMessage handleException(RuntimeException e) {
return new ErrorMessage("something went wrong");
}
每当客户端在发出以application/json
作为Accept
头的请求后触发RuntimeException
时,它都会收到一个带有正确状态代码和匹配json正文的响应:
{"error":"something went wrong"}
或者,如果Accept
头是application/XML
,则接收XML正文:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errorMessage><error>something went wrong</error></errorMessage>
调试时,我可以看到调用了mav.addObject()
方法。客户端的响应具有预期的状态代码,但内容类型为text/html
,正文中包含html,而不是原始请求中Accept
头指定的JSON或XLM内容
(请注意,上面示例中的实际异常、响应代码和文本消息并不重要,它们只是一个简单的示例。)
Spring版本:3.1.1.发布要获取
@ExceptionHandler
s以使用内容协商,必须为消息转换器提供一种方法,例如:
<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
,特别是HandlerResponseBody()
方法 我花了一些时间调查这件事,并写了一份报告,其中提出了问题的解决方案
更新:如果您使用的是Spring3.2,那么可以利用注释。更多详细信息可在my.中找到。通过在类路径上使用并添加Jackson,您无需配置消息转换器。默认情况下,Spring将为您提供JSON、XML(和一些其他转换器)。我将仔细查看
注释方法HandlerExceptionResolver
.Jaha的源代码;我从未在没有明确指定转换器的情况下使用@ExceptionHandler
s进行内容协商,但这可能取决于配置的另一个方面。不幸的是,setMessageConverters()
似乎不是接口的一部分,因此不太可能自动注入消息转换器。还有,你好,来自马尔默。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
<property name="messageConverters">
<list>
<ref bean="xmlConverter"/>
<ref bean="jsonConverter"/>
</list>
</property>
</bean>