Java Tomcat—当应用程序不可用时,如何获得http 500而不是404';部署不正确?

Java Tomcat—当应用程序不可用时,如何获得http 500而不是404';部署不正确?,java,tomcat,deployment,http-status-codes,apache,nginx,Java,Tomcat,Deployment,Http Status Codes,Apache,Nginx,我们有几个使用SpringMVC的REST应用程序。有时,部署后的某些应用程序无法启动。当我们的Javascript客户端尝试访问资源url时,它会得到404状态代码。因此,它假设该资源不存在。更适合我们的是Tomcat响应中返回的http状态500。是否可以更改此默认Tomcat行为 我发现JBoss(使用嵌入式Tomcat)也存在类似的问题,但没有答案: HTTP代理 如果您的Tomcat服务器前面有某种代理(如或),我相信可以将其配置为将404转换为不同的状态代码和错误页面。如果您没有任何

我们有几个使用SpringMVC的REST应用程序。有时,部署后的某些应用程序无法启动。当我们的Javascript客户端尝试访问资源url时,它会得到404状态代码。因此,它假设该资源不存在。更适合我们的是Tomcat响应中返回的http状态500。是否可以更改此默认Tomcat行为

我发现JBoss(使用嵌入式Tomcat)也存在类似的问题,但没有答案:

HTTP代理 如果您的Tomcat服务器前面有某种代理(如或),我相信可以将其配置为将404转换为不同的状态代码和错误页面。如果您没有任何代理或希望解决方案保持独立:

自定义Spring加载程序和servlet过滤器 因为您使用的是Spring,所以我猜您是在
web.xml
中引导它:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>com.blogspot.nurkiewicz.download.FailSafeLoaderListener</listener-class>
</listener>
代码非常简单-如果Spring初始化失败,记录异常并将其全局存储在ServletContext中。新加载程序必须替换
web.xml
中的旧加载程序:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>com.blogspot.nurkiewicz.download.FailSafeLoaderListener</listener-class>
</listener>
将此筛选器映射到所有请求(或者可能仅映射到控制器):


故障保护过滤器
/*

这个解决方案可能不是您想要的,但我给您一个通用的、有效的示例。

是的,经过一些更改,这是可能的

我们的工作:

  • 编写一个servlet,执行以下操作:

    if (req.getContextPath().isEmpty()){
        resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
    } else {
        resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
    }
    
  • 将包含此类的jar放入tomcat库

  • 更改conf/web.xml以添加servlet并将其映射到
    *.404

  • 将全局错误
    404
    设置为
    /404.404

    <error-page>
        <error-code>404</error-code>
        <location>/404.404</location>
    </error-page>
    
    
    404
    /404.404
    

您的servlet将被根应用程序和所有部署的应用程序调用。

感谢您的回复,但我们希望在Tomcat级别解决它,但我不知道是否可能。。。例如,Jetty在出现此类错误时返回503。与其尝试更改用户看到的状态代码,还不如确定部署失败的来源更有帮助吗?
<error-page>
    <error-code>404</error-code>
    <location>/404.404</location>
</error-page>