Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC,将@ExceptionHandler迁移到RESTful服务的HandlerExceptionResolver 背景_Java_Spring_Rest_Spring Mvc_Content Type - Fatal编程技术网

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>