Web服务将JAXB类编组错误

问题描述

| 我有一些wsimport生成的JAXB类
wsimport -d src/main/java -keep -extension
  -p my.package
  http://www.OpenLigaDB.de/Webservices/Sportsdata.asmx?WSDL
我将演示此类的问题(我自己仅添加了@XmlRootElement):
package my.package;

import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = \"Sport\",propOrder = {\"sportsID\",\"sportsName\"})
@XmlRootElement(name = \"sport\")   //Added by myself
public class Sport
{
    protected int sportsID;
    protected String sportsName;

    public int getSportsID() {return sportsID;}
    public void setSportsID(int value) {this.sportsID = value;}

    public String getSportsName() {return sportsName;}
    public void setSportsName(String value) {this.sportsName = value;}
}
直接实例化和编组工作正常(示例1)
Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName(\"test\");

JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);
现在让我们在网络服务调用中创建对象:
SportsdataSoap s = new Sportsdata().getSportsdataSoap();
ArrayOfSport sports = s.getAvailSports();

for(Sport sport : sports.getSport())
{
    JAXBContext jc = JAXBContext.newInstance(Sport.class);
    jc.createMarshaller().marshal(sport,System.out);
}
然后我得到了这个例外:
Exception in thread \"main\" java.lang.classCastException: my.package.Sport$JaxbAccessorF_sportsID cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor
    at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:199)
    at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:191)
    at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:282)
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.<init>(SingleElementNodeProperty.java:94)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.xml.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:128)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:183)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getorCreate(JAXBContextImpl.java:526)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:341)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1158)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:140)
    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 javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at my.package.TestOpenLiga.testdisciplines(TestOpenLiga.java:48)
    at my.package.TestOpenLiga.main(TestOpenLiga.java:130)
该如何处理?谢谢托尔。 更新2如果我对此修改Example1,则会收到相同的错误
SportsdataSoap s = new Sportsdata().getSportsdataSoap();

Sport sport = new Sport();
sport.setSportsID(1);
sport.setSportsName(\"test\");

JAXBContext jc = JAXBContext.newInstance(Sport.class);
jc.createMarshaller().marshal(sport,System.out);
更新2体育的XML结构
<Sport>
  <sportsID>int</sportsID>
  <sportsName>string</sportsName>
</Sport>
    

解决方法

我不确定这是否是发生这种情况的唯一原因,但这是我面临和解决的一个问题,请检查Java认可的目录并删除所有重复的jaxb-impl.jar。即使使用webservice-api.jar也可能发生这种情况。希望这可以帮助。     ,最近,当我尝试将JAXB升级到JDK随附的较新版本时,出现了相同的错误消息。我有一个外部版本的JAXB,但是我的JAX-WS仍然是JDK附带的内部版本。内部JAX-WS尝试调用内部JAXB,但是应用程序希望使用外部JAXB。 本质上,JAXB和JAX-WS都必须是内部的,或者两者都必须是外部的。如果您有外部JAXB,并且想要切换为使用内部版本,则该线程会提供建议。     ,我知道,这个问题很旧,但是我有一个类似的问题,我想在这里提供解决问题的方法。 问题是,与jws JAXB上下文所在的类加载器相同,我们在同一个类加载器中拥有一个jaxbcontext实例。 因此,我们在JAXB上下文中添加了类A,而jws确实在他的JAXB上下文中添加了类A。 在使用jws代码时,类加载器确实提供了错误的类,并且引发了classcast异常。 通过对此“共享”对象使用JAXB。(un)marshal函数,我们可以解决此问题。 更新:好的,既然有两个人问,我将在4年后更新这个问题:-) 上述问题指向分层类加载器问题。 JAXB通过注释动态生成类(非)编组对象,并将其添加到他的缓存中。这些类乍看起来似乎是相同的,但是对于相同的注释,它们是不同的类对象。之所以可行,是因为它们不在同一个类加载器中,并且服务器类加载器不会深入该类加载器树到另一个类加载器来找到它们。 当我们将来自较低类加载器的对象与较高层次结构中的类加载器混合时,编组无法进行匹配。 那就是我记得这个问题的方式。     ,我也时不时地遇到这个错误(它不是恒定的,令人沮丧!),我借助以下答案解决了这个问题:我在代码中添加了
httpClientPolicy.setAllowChunking(false);
,并且\\ o /,不再有问题:) 但是,是的,我不知道为什么:/     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...