gpt4 book ai didi

java - 如何一致地处理 Jersey 和 tomcat 错误?

转载 作者:可可西里 更新时间:2023-11-01 16:28:24 26 4
gpt4 key购买 nike

我已经用 jersey 实现了一些 (REST) 服务。如果有错误的请求,jersey 会处理错误并使用一些 JSON 内容进行回答。有一个 ExceptionMapper 应该捕获所有内容:

public class MyExceptionMapper implements ExceptionMapper<Throwable>

但是如果存在无效的 HTTP 请求 - 例如无效的内容类型 - tomcat 在 jersey 有机会处理异常之前处理异常。结果响应是一些丑陋的 tomcat HTML 错误页面,而不是所需的 JSON。

我知道可以设置 <error-page>在部署描述符中,但我无权访问任何错误详细信息。

有没有办法防止tomcat捕捉到这个错误?如果是这样,jersey 可以用它的 ExceptionMapper 捕获它并返回正确的响应。

最佳答案

你知道你可以设置一个“错误页面”,但你要把它指向什么?如果它只是一个静态网页,那么是的,您将无法访问错误详细信息。但是如果你将它转发给一个用于处理错误的 servlet,那么你应该有你的错误的详细信息,并且可以将控制权传回 Jersey 等。

web.xml:

  <error-page>
<error-code>415</error-code>
<location>/InvalidContentHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/InvalidContentHandler</location>
</error-page>

注意:在上面的 web.xml 中,您应该将 java.lang.Throwable 替换为您遇到的实际异常类型,您可以通过 "javax.servlet.error.exception "属性,如下所示。

InvalidContentHandler.java:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processError(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processError(request, response);
}

private void processError(HttpServletRequest request, HttpServletResponse response) throws IOException {

// Pass control to Jersey, or get some info:
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name");
String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri");
...
}

关于java - 如何一致地处理 Jersey 和 tomcat 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26427042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com