Jetty 9.4.3配置ServletContext初始化参数启动失败求助
解决Jetty设置ServletContext初始化参数时的IllegalStateException问题
你遇到的问题核心是设置初始化参数的时机不对。当你通过<Get name="ServletContext">调用setInitParameter时,Jetty的WebAppContext已经完成了初始化流程,此时ServletContext的初始化参数已被锁定,不允许再修改,这就是抛出IllegalStateException的直接原因。
正确的配置方式
不需要通过获取ServletContext来设置参数,直接在WebAppContext层面添加初始化参数即可。Jetty的WebAppContext提供了专门的配置入口,会在ServletContext初始化前完成参数设置,完全避开非法状态的触发条件。
修改你的部署XML文件如下:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/app1Context</Set> <Set name="war">/path/to/app.war</Set> <!-- 直接在WebAppContext上添加初始化参数 --> <Call name="setInitParameter"> <Arg>db.config.file</Arg> <Arg>/path/to/databasefile1.properties</Arg> </Call> </Configure>
为什么原来的方式不行?
Jetty的ServletContextHandler$Context.setInitParameter方法内置了状态检查:如果ServletContext已经完成初始化(比如WebAppContext已进入启动流程),就会抛出IllegalStateException。你原来的配置是先获取已经初始化的ServletContext再设置参数,正好触发了这个检查逻辑。
多实例配置验证
对于第二个应用实例,只需复制这份配置文件,修改contextPath和db.config.file的参数值即可,示例如下:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/app2Context</Set> <Set name="war">/path/to/app.war</Set> <Call name="setInitParameter"> <Arg>db.config.file</Arg> <Arg>/path/to/databasefile2.properties</Arg> </Call> </Configure>
这样两个实例就能分别加载不同的数据库配置文件,正常启动运行。
内容的提问来源于stack exchange,提问作者Raúl Malpica
相关产品推荐
相关产品推荐

