Jersey REST GET 正在工作,但 PUT 没有。请求的资源不允许指定的 HTTP 方法

Posted

技术标签:

【中文标题】Jersey REST GET 正在工作,但 PUT 没有。请求的资源不允许指定的 HTTP 方法【英文标题】:Jersey REST GET is working but PUT not. The specified HTTP method is not allowed for the requested resource 【发布时间】:2018-02-24 09:25:00 【问题描述】:

这几天我一直在为此烦恼。这个小片段运行良好(在 Tomcat 上使用 Jersey 2.26-b03)。

@GET
@Path("/code")
public Response update(@PathParam("code") String code) 
    System.out.println("!!!!!!!");
    return Response.status(Response.Status.OK).build();


curl -i -X GET http://localhost:18270/nyx/rest/servervirtueel/SVM0000
HTTP/1.1 200 OK

接下来是我启用的一堆泽西岛追踪。但是如果我只把GET改成PUT(完全一样的方法,只改注解):

@PUT
@Path("/code")
public Response update(@PathParam("code") String code) 
    System.out.println("!!!!!!!");
    return Response.status(Response.Status.OK).build();


curl -i -X PUT http://localhost:18270/nyx/rest/servervirtueel/SVM0000
HTTP/1.1 405 Method Not Allowed

随后 html 告诉我“所请求的资源不允许使用指定的 HTTP 方法”。但是,POST 确实有效(再次更改注释)。

【问题讨论】:

我希望您在更改@PUT 注释并将其部署到tomcat 后重新编译代码!对我来说,它与 jersey 2.26 在 tomcat 8.5.11 上配合得很好。 是的,我同意您提供的信息无法重现这一点。 当然,已经上千次了。当然,在那之后将其更改为 POST,所以我知道我在做什么。我正在使用 Tomcat 7.0.75。但我更进一步,编写了一个覆盖 doGet doPut doPost 和 doDelete 的普通 servlet。还有 PUT 和 DELETE 不起作用,其他的都不起作用。所以它似乎是Tomcat的事情,而不是泽西岛。但是设置 readonly 和 web-resource-collection 的 http-method 并不能解决它。目前这就是我所拥有的所有信息,我希望我知道的比我所看到的更多。 只是在黑暗中拍摄,但请尝试发送尸体。 【参考方案1】:

原来OWASP方法白名单阀门是在Tomcat(Catalina)级别配置的,只允许GET和POST;这是一个到目前为止只保存 SOAP 服务的 web 应用程序。您在 web.xml 或 server.xml 中都看不到它,但它在 Catalina/localhost/webappname.xml 中。

【讨论】:

以上是关于Jersey REST GET 正在工作,但 PUT 没有。请求的资源不允许指定的 HTTP 方法的主要内容,如果未能解决你的问题,请参考以下文章

Jersey REST (GET) throwing MessageBodyWriter not found for media type=application/xml

Jersey / Rest 默认字符编码

Jersey REST api 多种资源

找不到提供程序类:运行Jersey REST服务时

Jersey REST Web 服务、Tomcat、Eclipse 和 404

使用 Jersey 访问 REST 资源和静态资源