当前位置: 首页 > 面试题库 >

ClassCastException:无法转换为com.sun.xml.internal.bind.v2.runtime.reflect.Accessor

司徒杜吟
2023-03-14
问题内容

我有一个SOAP Web服务,正在尝试在应用程序内部调用。我正在使用cxf-codegen-plugin(3.1.10)从WSDL生成源。

使用生成的客户端,如果我在应用程序内调用Web服务,则效果很好。但是,我还针对导致问题的应用程序中的同一软件包使用了另一个JAXB实例。

例如,以下代码很好用:

OutboundServicePortType service = new OutboundService().getOutboundServicePort();
service.sendMessage(message);

但是,在此之前初始化一个新的JAXB实例会导致getOutboundServicePort()调用失败:

JAXBContext.newInstance(SendMessageRequest.class);

OutboundServicePortType service = new OutboundService().getOutboundServicePort();
service.sendMessage(message);

使用以下堆栈跟踪:

Caused by: java.lang.ClassCastException: outbound.model.standard.StandardOutboundMessage$JaxbAccessorF_messageUUId cannot be cast to com.sun.xml.internal.bind.v2.runtime.reflect.Accessor
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:190)
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:179)
    at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:271)
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.java:77)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113)
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:488)
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:153)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:488)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:305)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
    at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:152)
    at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:96)
    at com.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:98)
    at com.sun.xml.internal.ws.db.glassfish.JAXBRIContextFactory.newContext(JAXBRIContextFactory.java:79)
    ... 25 more
  • 我试着接受的解决方案System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");,其 的工作。但是,不幸的是,在我的环境中,设置此属性不是我的选择。另外,似乎这是一个骇客,无法解决真正的问题(除非我误解了)。

我要用剩下的小绳子把自己吊死。我在这里想念什么?


问题答案:

我不想回答我自己的问题,但是我想确保最终使用的解决方案得到了明确记录。

根本问题是camel-jaxb带来的jaxb-impl jar与JDK 8提供的版本冲突。

该答案更清楚地描述了正在发生的事情:

尝试将JAXB升级到JDK随附的更新版本时遇到了相同的错误。Java在运行时遇到了两个或多个JAXB实例,无法确定要使用哪个版本。

就我而言,问题在于我的应用程序使用了Web服务,而我也没有外部化JAX-WS。该应用程序使用com.sun.xml.bind.v2.runtime类开始,但是当它开始使用WSDL文件时,内部JAX-WS尝试调用com.sun.xml。内部.bind.v2.runtime类。当我下载并安装JAX-WS时,错误消失了,并且我能够继续升级。

尝试将JAXB升级到JDK随附的更新版本时遇到了相同的错误。Java在运行时遇到了两个或多个JAXB实例,无法确定要使用哪个版本。

就我而言,我只是排除了camel-jaxb附带的jaxb-impl,应用程序开始正常运行。



 类似资料:
  • 问题内容: 我知道在stackoverflow中已经对此提出了很多要求,但是我找不到适合我问题的答案。 在下面的以下代码中,我无法打印出每个项目,因为它说。 我曾尝试使用来打印每个项目,但都无法正常工作。 我认为可能是由于Edge类中的方法导致的问题,但是如果我不使用它,我将无法获得真实的键号(它将被打印为或类似的形式) 感谢您之前的帮助 主班 边缘类 图类 节点类 问题答案: private H

  • 问题内容: 我正在使用spring通过bean创建对象。现在,我尝试使用aop创建相同的对象,并且我无法将$ Proxy强制转换为SaleRoom异常。 先前的xml是: 我使用以下代码创建销售: 这是新的xml: Aspect日志记录类: 我正在使用相同的代码通过aop创建bean。并且在线程“主”中得到异常java.lang.ClassCastException:$ Proxy11无法转换为a

  • 问题内容: 我使用maven-eclipse创建了一个新的Spring MVC项目,并引发以下错误: (我尝试了stackoverflow的一些解决方案,但这些解决方案在我的情况下不起作用。pom.xml出现了一些我找不到的问题。我为servlet- api添加了提供的作用域,并尝试了它也不起作用。) 我的pom.xml如下: 我的web.xml如下: 问题答案: 更改 至 具有以下说明: 这很像

  • 问题内容: 您好,我的代码正在抛出。StackTrace显示: 即@ ps.setDate(6,(Date)affiliate.getDate()); 在DAO 以下是我的servlet: 以下是我的DAO: 以下是我的DTO: 请在这方面帮助我 问题答案: 由于文档说,将在参数的需要类型的Date对象。但是您似乎在课堂上使用了对象。 这就是为什么你得到了。 要解决此问题,您需要将类中的对象类型更

  • 问题内容: 在我的应用程序中,我需要将arraylist转换为数组的字符串。但是,我得到一个错误: 在与我在一起的错误: 这是完整的代码: 问题答案: 尝试 注意:我建议将listofurls重命名为arrayOfURLs

  • 我有一个与这里类似的问题,DispatcherServlet不能强制转换为Servlet,这是在使用Eclipse运行一个新的Spring MVC项目时发生的。然而,所有的答案都暗示了一个使用Maven的解决方案,而我没有使用Maven。 我为这个问题找了一天,但没有解决办法。