部署JAX-RS应用到WebSphere 8.5时出现Servlet mapping not found错误
问题根因与解决方案
1. 修复web.xml版本兼容问题
WebSphere 8.5.5遵循Java EE 6规范,最高仅支持web-app 3.0版本,你当前使用的3.1版本schema会导致WebSphere解析web.xml异常,无法正确识别注册的Servlet信息。
替换web.xml头部为3.0版本配置:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
2. 修正Servlet名称配置
WebSphere对Servlet名称的特殊字符处理比Tomcat更严格,当前配置中servlet-name使用的带空格值Java WS容易出现匹配异常。
- 将
<servlet>节点下的<servlet-name>修改为无空格值,例如JavaWS - 同步修改
<servlet-mapping>节点下的<servlet-name>为相同的无空格值,保证两端完全一致
3. 解决JAX-RS实现冲突
WebSphere 8.5.5内置了基于Apache Wink的JAX-RS 1.1实现,会和你引入的Glassfish Jersey实现产生冲突,仅修改类加载策略无法完全屏蔽内置实现:
- 在WEB-INF目录下新增
ibm-web-bnd.xml配置文件,添加如下内容禁用内置JAX-RS处理器:
<?xml version="1.0" encoding="UTF-8"?> <web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_2.xsd" version="1.2"> <classLoader order="PARENT_LAST"/> <jaxrs-api disabled="true"/> </web-bnd>
- 确认WAR包的WEB-INF/lib目录下已包含所有Jersey运行所需的依赖包,不存在缺失。
内容的提问来源于stack exchange,提问作者jaykio77
相关产品推荐
相关产品推荐

