我使用RESTEasy 3.0.1和Spring 3.1.4实现了REST服务。
我的最小REST资源如下所示:
@Path ("test")
public class TestResource {
@GET
@Path ("hello")
@Produces("text/plain")
public String hello() {
return "hello world";
}
}
使用Spring的 DispatcherServlet 设置应用程序。这是我的 web.xml :
<web-app ...>
<servlet>
<servlet-name>resteasyApp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>resteasyApp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Spring和RESTeasy使用RESTEasy的 Spring Integration (resteasy-spring)捆绑在一起。在RESTEasy的文档中有一个chapter。我正在使用段落 45.2 中描述的方法。
Spring配置文件包含:
<beans ...>
<context:annotation-config/>
<import resource="classpath:springmvc-resteasy.xml"/>
<bean class="rest.TestResource"/>
</beans>
该应用程序适用于此设置。在资源 / test / hello 上执行 GET 请求时,我得到包含 String “hello world”的预期响应,状态代码为200 。 DELETE 请求应返回状态405(方法不允许),因为我的资源不支持 DELETE 。但是,我收到以下回复:
HTTP/1.1 500 No resource method found for DELETE, return 405 with Allow header
Content-Length: 0
Server: Jetty(6.1.26RC0)
状态代码为500(内部服务器错误),通常由RESTEasy发送各种意外异常。我可以确认内部RESTEasy会抛出 NotAllowedException ,然后导致状态为500的响应。
我认为,我的问题来自弹簧配置(如下所示)。我还试图通过RESTEasy的 FilterDispatcher as described in the documentation在没有Spring的情况下设置我的应用程序。在这种情况下, DELETE 请求还会触发 NotAllowedException 。但这一次它被正确映射到405响应。如何在Spring应用程序中获得此行为?