WebLogic 12.2.1.4启动JAX-RS2.0应用报BEA-2192510警告如何解决
BEA-2192510警告触发逻辑为:WebLogic 12.2.1.x内置JAX-RS集成组件会自动扫描类路径下所有继承javax.ws.rs.core.Application的类,尝试自动注册对应Jersey Servlet。扫描过程中误识别Jersey框架自带的基础类org.glassfish.jersey.server.ResourceConfig及其内部类WrappingResourceConfig、RuntimeConfig为用户自定义的JAX-RS应用入口类,而这些框架类本身不会标注@ApplicationPath注解,因此输出警告。
该警告默认不影响业务功能运行,若需彻底消除可按以下方案调整配置。
按实际场景选择任意一种方案即可:
方案1:调整类加载优先级,隔离服务器内置Jersey与应用依赖
现有配置中注释org.glassfish.jersey.*、org.glassfish.hk2.*包的应用优先加载规则是核心诱因,该配置会导致WebLogic优先加载内置的旧版JAX-RS组件,扫描时识别到应用内Jersey 2.22.2自带的基础ResourceConfig类,触发警告。
操作步骤:- 放开
weblogic-application.xml中被注释的两行包过滤配置,补全Jersey 2.x相关包的优先加载规则,最终<prefer-application-packages>配置如下:
<prefer-application-packages> <!-- Jersey 2.x 核心包,强制优先加载应用自带版本 --> <package-name>org.glassfish.jersey.*</package-name> <package-name>org.glassfish.hk2.*</package-name> <package-name>org.jvnet.hk2.*</package-name> <package-name>jersey.repackaged.org.objectweb.asm.*</package-name> <package-name>com.sun.jersey.*</package-name> <package-name>com.sun.research.ws.wadl.*</package-name> <package-name>com.sun.ws.rs.ext.*</package-name> <!-- JSON序列化依赖包 --> <package-name>org.codehaus.jackson.*</package-name> <package-name>com.fasterxml.jackson.*</package-name> <package-name>org.codehaus.jettison.*</package-name> <!-- JAX-RS 标准API包 --> <package-name>javax.ws.rs.*</package-name> <!-- 字节码处理依赖包 --> <package-name>org.objectweb.asm.*</package-name> </prefer-application-packages>- 删除
WEB-INF/weblogic.xml中对WebLogic内置jax-rs 2.0库的引用配置,避免内置库与应用自带Jersey依赖产生类冲突。
- 放开
方案2:关闭WebLogic内置JAX-RS自动注册逻辑
若不调整类加载规则,可直接配置WebLogic忽略无@ApplicationPath注解的Application类,不尝试自动注册Servlet,从源头阻断警告触发。
操作步骤:在WEB-INF/weblogic.xml的<container-descriptor>节点下添加如下配置:<wls:container-descriptor> <wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes> <!-- 忽略无@ApplicationPath注解的JAX-RS应用类,不自动注册 --> <wls:jaxrs-application-with-no-application-path>ignore</wls:jaxrs-application-with-no-application-path> </wls:container-descriptor>方案3:显式定义自定义JAX-RS应用入口类
若当前应用未显式定义继承ResourceConfig的入口类,会导致WebLogic扫描时遍历所有Jersey相关的Application实现类。新增自定义入口类并标注@ApplicationPath注解后,WebLogic会直接识别到合法的应用入口,不再尝试注册框架自带的基础类。
示例代码:import javax.ws.rs.ApplicationPath; import org.glassfish.jersey.server.ResourceConfig; @ApplicationPath("/rest") public class AppResourceConfig extends ResourceConfig { public AppResourceConfig() { // 仅扫描业务代码中REST服务所在的包路径,缩小扫描范围 packages("com.yourorg.yourapp.rest"); } }
完成配置调整后清空WebLogic的临时缓存目录(servers/<ServerName>/tmp、servers/<ServerName>/cache),重启服务后查看启动日志,三条BEA-2192510警告会完全消失,REST接口可正常访问。
内容的提问来源于stack exchange,提问作者Satya M

