我们正在研究将一些web JSF应用程序从Payara 5迁移到Tomcat 9 (TomEE 8)的可能性。我们使用Java 11和Java 7/8,我们的应用程序使用RMI连接到后端服务器。目前,在Payara 5中,当连接我们到后端服务器的代码失败(由于服务器不可用或web.xml中定义的凭据无效而引发异常)时,部署失败。
请参阅这段代码:
public class MainServlet extends HttpServlet {
//constructor, variables etc.
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//read configurations from web.xml
try {
connectToBackendServer();
catch (Exception e) {
throw new UnavailableException("Cannot connect to Backend Server");
}
}
//other methods
}上面的代码使Payara 5上的部署失败,但是Tomcat 9允许部署。使用Tomcat,我们注意到,通过检查日志或尝试前端并获取错误,后端是不正常的。参见下面的图片,其中NullPointerException是由connectToBackendServer()方法抛出的。

我们充分意识到这不是最好的方法,因为后端在成功部署之后可能会失败,但至少我们正在讨论来自web.xml的配置错误的情况。
我们能用Tomcat 9(TomEE 8)实现类似的功能吗?
提前谢谢大家!
。。
发布于 2022-07-28 08:17:41
将逻辑移动到ServletContextListener,并从contextInitialized()抛出运行时异常。在许多服务器上,这将导致部署失败,对应用程序的任何请求都将返回error 500。不过,规范不需要这种精确的行为,因此服务器之间的结果略有不同。
这是一个使用失败部署的ServletContextListener的示例实现:
package com.example;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
@WebListener
public class ExampleServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent e) {
try {
callThatFailsAndThrowsAnException();
catch (Exception e) {
throw new UnavailableException("Something went very wrong - I'm bailing out.");
}
}
@Override
public void contextDestroyed(ServletContextEvent e) {
/* Application shutdown */
}
}@WebListener向容器注册上下文侦听器。如果您使用的是JakartaEE/JavaEE的旧版本,并且注释不可用,则可以在web.xml中注册上下文侦听器。
https://stackoverflow.com/questions/73076742
复制相似问题