HTTP プロキシ
Tomcat サーバーの前にある種のプロキシ ( apacheやnginxなど) がある場合、404 を別のステータス コードとエラー ページに変換するように構成できると思います。プロキシがない場合、またはソリューションを自己完結型のままにしたい場合:
カスタム Spring ローダーとサーブレット フィルター
ContextLoaderListener
あなたはSpringを使用しているので、 inを使用してブートストラップしていると思いますweb.xml
:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
このクラスは Spring のブートストラップを担当し、これはほとんどの場合、アプリケーションの起動が失敗する原因となるステップです。そのクラスを拡張して例外を飲み込むだけで、サーブレット コンテナーに到達しないため、Tomcat はアプリケーションのデプロイが失敗したとは見なしません。
public class FailSafeLoaderListener extends ContextLoaderListener {
private static final Logger log = LoggerFactory.getLogger(FailSafeLoaderListener.class);
@Override
public void contextInitialized(ServletContextEvent event) {
try {
super.contextInitialized(event);
} catch (Exception e) {
log.error("", e);
event.getServletContext().setAttribute("deployException", e);
}
}
}
コードは非常に単純です。Spring の初期化が失敗した場合、例外をログに記録し、グローバルにServletContext
. の古いローダーを新しいローダーに置き換える必要がありweb.xml
ます。
<listener>
<listener-class>com.blogspot.nurkiewicz.download.FailSafeLoaderListener</listener-class>
</listener>
あとは、グローバル フィルターのサーブレット コンテキストからその属性を読み取り、アプリケーションが Spring の起動に失敗した場合はすべてのリクエストを拒否するだけです。
public class FailSafeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Exception deployException = (Exception) request.getServletContext().getAttribute("deployException");
if (deployException == null) {
chain.doFilter(request, response);
} else {
((HttpServletResponse) response).sendError(500, deployException.toString());
}
}
}
このフィルターをすべてのリクエストにマップします (またはコントローラーのみ?):
<filter-mapping>
<filter-name>failSafeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
解決策はあなたが望むものではないかもしれませんが、一般的な実用的な例を示しています。