以前,当我在 Grizzly 上使用 Jersey 时,如果我调用了 Jersey 注释中未定义的 HTTP 方法,它将返回 405 Method Not Allowed 响应,这很好。
现在我在 Tomcat 上运行 Jersey,服务器返回 Tomcat 的特定 405 html 页面。我怎样才能恢复到简单地发送带有空正文的响应?
以前,当我在 Grizzly 上使用 Jersey 时,如果我调用了 Jersey 注释中未定义的 HTTP 方法,它将返回 405 Method Not Allowed 响应,这很好。
现在我在 Tomcat 上运行 Jersey,服务器返回 Tomcat 的特定 405 html 页面。我怎样才能恢复到简单地发送带有空正文的响应?
取自该线程: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 请求并返回一个可以由应用程序解析的更有用的错误资源。
您可以在 webapp 的 web.xml 中配置自定义页面:
<error-page>
<error-code>405</error-code>
<location>/empty.txt</location>
</error-page>
位置可以引用一个空的文本文件或 JSP/Servlet/任何适合您的需要。
我的自定义异常我在响应中返回了一个错误对象(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)