Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面
Posted
技术标签:
【中文标题】Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面【英文标题】:405 Method Not Allowed in Jersey is returning Tomcat's 405 page 【发布时间】:2012-03-14 23:01:59 【问题描述】:以前,当我在 Grizzly 上使用 Jersey 时,如果我调用了 Jersey 注释中未定义的 HTTP 方法,它将返回 405 Method Not Allowed 响应,这很好。
现在我在 Tomcat 上运行 Jersey,服务器返回 Tomcat 的特定 405 html 页面。我怎样才能恢复到简单地发送带有空正文的响应?
【问题讨论】:
【参考方案1】:取自该线程:http://jersey.576304.n2.nabble.com/how-to-catch-405-errors-td4937392.html
像这样创建一个异常映射器类:
@Provider
public class MyMapper implements
ExceptionMapper<WebApplicationException>
public Response toResponse(WebApplicationException e)
Response r = e.getResponse();
if (r.getStatus() == 405)
return Response.fromResponse(r).entity(...).build();
return r;
这使我能够捕获 405 请求并返回更有用的错误资源,可以由应用程序解析。
【讨论】:
【参考方案2】:您可以在 webapp 的 web.xml 中配置自定义页面:
<error-page>
<error-code>405</error-code>
<location>/empty.txt</location>
</error-page>
位置可以引用一个空的文本文件或 JSP/Servlet/任何适合您的需要。
【讨论】:
【参考方案3】:我的自定义异常在响应中返回了一个错误对象 (POJO)...而我的 servlet 服务器不知道如何将错误转换为 JSON。
我通过添加以下maven依赖解决了这个问题:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.27</version>
</dependency>
我的回复是这样的:
@Override
public Response toResponse(WebApplicationException e)
Response r = e.getResponse();
if (r.getStatus() == 405)
Error error = new Error(Response.Status.BAD_REQUEST.toString(), e.getMessage());
return Response.fromResponse(r).status(Response.Status.BAD_REQUEST).header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.entity(error)
.build();
return r;
实际上,成功的部分是:
header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
【讨论】:
以上是关于Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面的主要内容,如果未能解决你的问题,请参考以下文章
jersey rest post 访问为http 405 异常如何解决
NetworkError:WCF 中不允许使用 405 方法