异常 java.lang.IllegalArgumentException: Unable to access unsupported property javax.xml.stream.suppor

本文介绍了一种在使用weblogic.jar开发基于WebLogic的JMS客户端时遇到的问题,当该客户端发布到Tomcat时,系统出现了异常。通过分析错误日志,发现是由于对不支持的属性进行访问导致的。最终解决方案是采用WebLogic瘦客户端的方式,替换原有的weblogic.jar为wlclient.jar和wljmsclient.jar。

 在使用webloigc.jar开发基于weblogic的jms客户端时,发布至tomcat系统异常

 

严重: WSSERVLET11: failed to parse runtime descriptor: java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
 at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parse(DeploymentDescriptorParser.java:144)
 at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized(WSServletContextListener.java:124)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:924)
 at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:887)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1147)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
 at org.apache.catalina.core.StandardService.start(StandardService.java:516)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.IllegalArgumentException: Unable to access unsupported property javax.xml.stream.supportDTD
 at weblogic.xml.stax.ConfigurationContextBase.check(ConfigurationContextBase.java:60)
 at weblogic.xml.stax.ConfigurationContextBase.setProperty(ConfigurationContextBase.java:54)
 at weblogic.xml.stax.XMLStreamInputFactory.setProperty(XMLStreamInputFactory.java:280)
 at com.sun.xml.ws.api.streaming.XMLStreamReaderFactory.getXMLInputFactory(XMLStreamReaderFactory.java:112)
 at com.sun.xml.ws.api.streaming.XMLStreamReaderFactory.<clinit>(XMLStreamReaderFactory.java:78)

 

网上搜索未果,考虑采用weblogic瘦客户端,即去掉weblogic.jar,引入wlclient.jar,wljmsclient.jar,问题解决

### 问题分析 `java.lang.IllegalArgumentException: Unable to create call adapter for class java.lang.Object` 是 Retrofit 在处理接口定义时,无法找到合适的 `CallAdapter` 来适配返回值类型时抛出的异常。通常情况下,这种错误发生在接口方法返回类型为 `Object` 或者使用了与当前配置不兼容的响应类型(如 `Observable`、`Flowable`、`Single` 等)。 Retrofit 通过 `CallAdapter.Factory` 来决定是否能够处理特定的返回类型。如果接口返回类型为 `Object`,而没有适配器能够处理该类型,就会导致此异常。 --- ### 解决方案 #### 1. **升级 Retrofit 及相关依赖版本** 确保所有 Retrofit 相关依赖的版本保持一致,并且升级到较新的版本。旧版本的 Retrofit 可能不支持某些返回类型(如 RxJava 2 的 `Observable` 或 `Flowable`)。以下是推荐的依赖配置: ```groovy implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' ``` 使用统一版本可以避免因兼容性问题导致的 `CallAdapter` 创建失败。 #### 2. **检查接口定义与适配器匹配** 确保接口方法的返回类型与已注册的 `CallAdapter` 兼容。例如,如果使用了 `RxJava2CallAdapterFactory`,则接口方法应返回 `io.reactivex.Observable`、`io.reactivex.Single` 或 `io.reactivex.Flowable` 等类型: ```java @GET("data") Observable<Response<SomeModel>> getData(); ``` 如果返回类型为 `Object` 或 `Call<Object>`,则需要确保 `Retrofit` 实例已注册一个能够处理 `Object` 类型的 `CallAdapter`。 #### 3. **添加默认适配器** 如果接口方法返回类型为 `Call<T>`,但 `T` 是 `Object`,可以考虑使用 `DefaultCallAdapterFactory` 来支持通用的 `Call` 返回类型: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addCallAdapterFactory(new DefaultCallAdapterFactory()) .build(); ``` #### 4. **检查 RxJava 版本兼容性** 如果使用了 RxJava 作为响应类型,确保 `RxJava2CallAdapterFactory` 被正确添加到 `Retrofit` 实例中: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); ``` 同时,确保 RxJava 的版本与 `adapter-rxjava2` 兼容。例如: ```groovy implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxjava:2.x.x' ``` #### 5. **避免返回类型混淆** 如果接口方法返回类型为 `rx.Observable`(RxJava 1)而使用了 `RxJava2CallAdapterFactory`(RxJava 2),也会导致 `CallAdapter` 创建失败。应统一使用 RxJava 2 的 `io.reactivex.Observable`。 --- ### 示例代码 以下是一个完整的 Retrofit 配置示例,包含 RxJava 支持: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); ``` 对应的接口定义: ```java public interface ApiService { @GET("data") Observable<Response<SomeModel>> getData(); } ``` --- ### 总结 解决 `java.lang.IllegalArgumentException: Unable to create call adapter for class java.lang.Object` 的核心在于确保 Retrofit 的版本兼容性、接口返回类型与 `CallAdapter` 的匹配性。通过升级依赖、统一版本、正确配置适配器,可以有效避免此类问题。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值