以前,当我在Grizzly上使用Jersey时,如果我调用了一个未在Jersey注释中定义的HTTP方法,它将返回405 Method Not Allowed响应,这很好。
现在我在Tomcat上运行Jersey,服务器返回Tomcat特定的405 html页面。我怎样才能恢复简单地发送一个空体的响应?
答案 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对象(POJO)...而我的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)