强制在Tomcat上部署Web应用程序失败

hm2xizp9  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(194)

我们正在研究将一些Web JSF应用程序从Payara 5迁移到Tomcat 9的可能性(TomEE 8)。我们使用Java 11和Java EE 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,我们通过检查日志或者尝试前端并获得错误来注意后端不正常。请参见下图,其中我们的 connectToBackendServer() 方法抛出了NullPointerException。

我们完全知道这不是最好的方法,因为在成功部署之后,后端可能会失败,但至少我们涵盖了来自 web.xml 的配置错误的情况。
我们能否使用Tomcat 9(TomEE 8)实现类似的功能?
提前感谢大家!
..

k75qkfdt

k75qkfdt1#

将您的逻辑移到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中注册上下文侦听器。

相关问题