我们正在研究将一些web JSF应用程序从Payara 5迁移到Tomcat 9(第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允许部署.通过判断日志(log)或try 前端并获取错误,我们注意到Tomcat的后端并不正常.请参见下图,其中NullPointerException是由我们的connectToBackendServer()方法引发的.

enter image description here

我们完全知道这不是最好的方法,因为在成功部署后后端可能会失败,但至少我们讨论了web.xml的配置错误的情况.

我们可以用Tomcat 9(TomEE 8)实现类似的功能吗?

提前谢谢大家!

..

推荐答案

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

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

具有默认分支的JUnit代码覆盖率切换声明

尽管类型擦除,instanceof与泛型在Java中如何工作?

Java inline Double条件和值解装箱崩溃

所有 case 一起输入时输出错误,而单独放置时输出正确

如何在Java中从XML中获取特定的 node ,然后将其删除?

将响应转换为带值的键

把一条整型短裤和两条短裤装成一条长的

%This内置函数示例

如何从HttpResponse实例获取Entity对象的内容?

Java组件项目中的JavaFX对话框国际化

将stringBuilder + forloop转换为stream + map

如何使这两种方法合二为一?

使用迭代器遍历HashMap不会因IF条件而停止

Java KeyListener不工作或被添加

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

在输入端没有可行的替代方案'; Select *';

为什么Java编译器为没有参数的方法(getter方法)创建桥接方法

具有 DayOfWeek 列表的 JPA 实体