JAXB классы из-за ошибки сортировки Webservice - PullRequest
7 голосов
/ 25 мая 2011

У меня есть несколько сгенерированных 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;}
}

Прямое создание имаршаллинг работает нормально ( Example1 )

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>

Ответы [ 4 ]

2 голосов
/ 25 ноября 2014

Недавно я получил такое же сообщение об ошибке, когда пытался обновить JAXB до более новой версии, чем та, которая шла с JDK. У меня была внешняя версия JAXB, но мой JAX-WS по-прежнему оставался внутренней версией, поставляемой с JDK. Внутренний JAX-WS попытался вызвать внутренний JAXB, но приложение хотело использовать внешний JAXB.

По сути, JAXB и JAX-WS должны быть внутренними или внешними. В этой теме есть совет, если у вас есть внешний JAXB, и вы хотите перейти на использование внутренней версии.

2 голосов
/ 01 апреля 2014

Я знаю, что этот вопрос старый, но у меня просто была похожая проблема, и я хотел предоставить решение этой проблемы здесь.

Проблема заключалась в том, что у нас был собственный экземпляр jaxbcontext в том же загрузчике классов, в котором находился JAXB-контекст jws.

Таким образом, мы добавили класс A в наш контекст JAXB, а jws добавили класс A в его контекст JAXB.

При использовании кода jws загрузчик классов действительно предоставил неправильный класс, и было сгенерировано исключение classcast.

Используя функции маршала JAXB. (Un) для этого «общего» объекта, мы могли бы решить эту проблему.

ОБНОВЛЕНИЕ: Хорошо, так как два спросили, я обновлю этот вопрос через 4 года: -)

Проблема, описанная выше, указывает на проблему иерархического загрузчика классов. JAXB генерирует класс (не) маршаллинг объектов на лету из аннотаций и добавляет их в свой кеш. Эти классы на первый взгляд кажутся идентичными, но это разные объекты классов для одних и тех же аннотаций. Это работает, потому что они не находятся в одном и том же загрузчике классов, и серверный загрузчик классов не будет погружаться вниз по дереву загрузчиков классов к другому загрузчику классов, чтобы найти их.

Когда мы смешали объекты из нижнего загрузчика классов с загрузчиком классов выше по иерархии, сортировка не смогла найти совпадение.

Вот как я помню проблему.

2 голосов
/ 25 мая 2011

Я не уверен, что это единственная причина, по которой это могло произойти, но это одна проблема, с которой я столкнулся и решил вот так: проверьте ваш каталог, одобренный Java, и удалите любой дубликат jaxb-impl.jar.Это может произойти даже с webservice-api.jar.Надеюсь, это поможет.

0 голосов
/ 07 апреля 2014

я пересекаю эту ошибку, время от времени тоже (она не была постоянной, разочарование !!), и я решил ее с помощью этого ответа : я добавляю httpClientPolicy.setAllowChunking(false); в свойкод и \ o /, больше проблем нет:)

Но, правда, я не знаю почему: /

...