WebSphere 9部署Crnk应用Servlet.init()两次调用报SRVE0271E错误咨询
问题原因
该现象是WebSphere Web容器的默认Servlet加载逻辑和Tomcat存在差异导致的:第一次init是过滤器链处理前WAS预加载Servlet触发,第二次是过滤器链处理完成后正式处理请求时再次触发初始化,两次初始化状态冲突就会抛出SRVE0271E错误。
可用解决方法
方法1:修改Web容器自定义属性(最适配当前场景的配置方案)
这是WAS专门针对这类init重复调用问题提供的官方配置项,操作步骤如下:
- 登录WebSphere集成解决方案控制台,进入路径:
服务器 > 服务器类型 > WebSphere Application Server,点击部署该应用的目标服务器名称 - 在
容器设置分类下选择Web容器,点击右侧的自定义属性 - 点击
新建,添加如下属性:- 名称:
com.ibm.ws.webcontainer.invokeFiltersAfterServletLoaded - 值:
false
- 名称:
- 保存配置,同步节点后重启对应服务器即可生效。
方法2:配置Servlet启动时加载
避免请求触发时才初始化Servlet,从根源上规避重复加载问题:
在应用的web.xml中对应Crnk Servlet的配置段添加<load-on-startup>1</load-on-startup>配置,数值越小启动加载优先级越高,示例配置如下:
<servlet> <servlet-name>SimpleCrnkServlet</servlet-name> <servlet-class>xxx.xxx.SimpleCrnkServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
方法3:排查重复Servlet配置
WebSphere对重复Servlet定义的处理逻辑和Tomcat不同,若你同时通过@WebServlet注解和web.xml两种方式定义了同一个Servlet,会生成两个独立的ServletWrapper实例,就会触发两次init调用,删掉其中一种重复配置即可。
内容的提问来源于stack exchange,提问作者Mariusz W
相关产品推荐
相关产品推荐

