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 方法

HTTP 状态 405 – Apache Tomcat 服务器中不允许的方法 [重复]

405 - 机器人框架中不允许的方法

Laravel 中不允许使用奇怪的 405 方法

Spring Boot POST 请求返回 http 状态 405“方法不允许”而不是 HTTP 状态 404