在Jersey中不允许的方法是返回Tomcat的405页面

时间:2012-02-24 13:41:35

标签: rest tomcat jersey http-status-code-405

以前,当我在Grizzly上使用Jersey时,如果我调用了一个未在Jersey注释中定义的HTTP方法,它将返回405 Method Not Allowed响应,这很好。

现在我在Tomcat上运行Jersey,服务器返回Tomcat特定的405 html页面。我怎样才能恢复简单地发送一个空体的响应?

3 个答案:

答案 0 :(得分: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请求并返回一个可以由应用程序解析的更有用的错误资源。

答案 1 :(得分:0)

您可以在webapp的web.xml中配置自定义页面:

<error-page>
    <error-code>405</error-code>
    <location>/empty.txt</location>
</error-page>

位置可以引用空文本文件或JSP / Servlet /满足您需求的任何内容。

答案 2 :(得分:0)

我的自定义异常是我在Response中返回一个Error对象(PO​​JO)...而我的servlet服务器不知道如何将Error转换为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)