![](/img/trans.png)
[英]Maven fail to deploy web application at Tomcat server in Mac OS X
[英]Force deploy of web application to fail on Tomcat
我们正在研究将一些 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) 实现类似的功能吗?
谢谢大家!
..
将您的逻辑移动到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
中注册上下文侦听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.