Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何中止初始化异常的启动过程_Java_Servlets_Jakarta Ee_Websphere - Fatal编程技术网

Java 如何中止初始化异常的启动过程

Java 如何中止初始化异常的启动过程,java,servlets,jakarta-ee,websphere,Java,Servlets,Jakarta Ee,Websphere,我在WebSphere8.5.5.8上有一个WebApplication,它是一个(或多或少是空的)EAR项目,其中包含我的WAR项目 在启动时加载的主Servlet中,如果一切正常,我会进行一些检查。 如果不是,我将抛出一个javax.servlet.ServletException 我的期望是,Websphere会意识到存在问题,并中止我的应用程序的启动,因此它根本不可用 实际发生的情况是,Websphere只记录该异常,仅记录警告级别,该异常甚至存在于另一个文件中,而不是日志本身: [06

我在WebSphere8.5.5.8上有一个WebApplication,它是一个(或多或少是空的)EAR项目,其中包含我的WAR项目

在启动时加载的主Servlet中,如果一切正常,我会进行一些检查。 如果不是,我将抛出一个
javax.servlet.ServletException

我的期望是,Websphere会意识到存在问题,并中止我的应用程序的启动,因此它根本不可用

实际发生的情况是,Websphere只记录该异常,仅记录警告级别,该异常甚至存在于另一个文件中,而不是日志本身:

[06.04.16 07:42:27:229 CEST] 0000004c FfdcProvider  W com.ibm.ws.ffdc.impl.FfdcProvider logIncident FFDC1003I: FFDC-Vorfall an C:\IBM\WAS8.5\profiles\AppSrv01\logs\ffdc\server1_bb44715_16.04.06_07.42.27.2056702894000999712166.txt com.ibm.ws.webcontainer.servlet.ServletInstance.init 259 erstellt.
然后,我的应用程序将以任何方式启动,以便与浏览器一起使用。人们当然会开始使用它,然后意识到存在问题。在挖掘日志文件后,发现启动失败

问题: 如何使Websphere中止启动过程? 是否有一种特殊的例外我可以抛出? 我试过了

  • javax.servlet.ServletException
  • javax.servlet.UnavailableException
  • java.lang.Error
我在IBM论坛上发现,这表明我预期的行为将违反JEE规范,这对我来说没有多大意义

如前所述,我尝试了一个
javax.servlet.ServletContextListener
,另外一个好处是,我将在日志中得到一条错误消息,但应用程序仍然启动

如前所述,我尝试了启动bean。这里发布的解决方案对我不起作用,那些专有的启动bean是,它们也是。我只有一个EAR项目,因为Websphere/RAD迫使我在本地环境中使用它。在测试/生产系统上,仅使用WAR

如果我使用EJB3.1定义的启动bean:

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
@Singleton
@Startup
public class MyStartupBean {
    public boolean start() {
        System.out.println("MyStartupBean.start()");
        return false;
    }
    public void stop(){
        System.out.println("MyStartupBean.stop()");
    }
    @PostConstruct
    public void postConstruct() {
        System.out.println("MyStartupBean.postConstruct()");
    }
}

没有调用
start()
方法,我只在日志中看到
postConstruct()
消息。在
postConstruct()
中抛出异常不会中止启动过程。

到目前为止,我只想到了一个解决方法(受Jason Faust在中的评论启发):

具有静态标志,如果初始化已正确完成,则将其设置为true。 使用筛选器检查该标志,如果该标志为false,则输出错误,以便在启动失败时至少应用程序看起来不可用:

public class HealthCheckFilter implements Filter{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if(AppBridge.isStartupFinished()) {
            chain.doFilter(request, response);
        }else {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.setCharacterEncoding(AppConstants.ENCODING);
            httpResponse.setContentType("text/plain");
            httpResponse.setStatus(500);
            PrintWriter out = httpResponse.getWriter();
            out.write("Startup failed");
        }
    }
    /* Methods init(FilterConfig filterConfig) and destroy() ommitted*/
}

到目前为止,我只想到了一个解决办法(灵感来自于杰森·浮士德在书中的评论):

具有静态标志,如果初始化已正确完成,则将其设置为true。 使用筛选器检查该标志,如果该标志为false,则输出错误,以便在启动失败时至少应用程序看起来不可用:

public class HealthCheckFilter implements Filter{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if(AppBridge.isStartupFinished()) {
            chain.doFilter(request, response);
        }else {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.setCharacterEncoding(AppConstants.ENCODING);
            httpResponse.setContentType("text/plain");
            httpResponse.setStatus(500);
            PrintWriter out = httpResponse.getWriter();
            out.write("Startup failed");
        }
    }
    /* Methods init(FilterConfig filterConfig) and destroy() ommitted*/
}
可能的重复可能的重复