Netbeans с JAXB случайным ClassCastException.невозможно привести к com.солнце.XML.связывать.П2.во время выполнения.отражать.Средство доступа

Я загрузил сообщения Soap из службы SOAP и пытаюсь издеваться над службой Soap, возвращая загруженные сообщения. следующий код показывает, как я распаковываю сообщение Soap в требуемый ответ

    public static DataClientType unmarshallFile(String fileName) throws Exception {
    XMLInputFactory xif = XMLInputFactory.newFactory();
    XMLStreamReader xsr = xif.createXMLStreamReader(ClientSampleSoapResponseData.class.getResourceAsStream(fileName));
    xsr.nextTag(); // Advance to Envelope tag
    xsr.nextTag(); // Advance to Header
    xsr.nextTag(); // Advance to Body tag
    xsr.nextTag(); // Advance to getClientByAccountResponse
    xsr.nextTag(); // Advance to content of getClientByAccountResponse

    JAXBContext jc = JAXBContext.newInstance(GetClientByAccountResponse.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    JAXBElement<GetClientByAccountResponse> je = unmarshaller.unmarshal(xsr, GetClientByAccountResponse.class);

    return je.getValue().getClientDataContract();
}

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

java.lang.ClassCastException: com.x.X.X.X.GetClientByAccountResponse$JaxbAccessorF_clientDataContract 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:188)
at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:180)
at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:256)
at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.<init>(SingleElementNodeProperty.java:90)

Я пробовал другие онлайн-предложения, такие как возврат к старым версиям jaxb и использование одобренных папок в конфигурации компилятора maven, но это все равно происходит

любые идеи о том, что может быть причиной и возможные решения?

спасибо u

7 ответов


решено со следующим кодом

@BeforeClass
public static  void init(){ 
    System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
}

@AfterClass
public static void revert(){ 
    System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize");
}    

параметр также может быть установлен в JVM с помощью

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true

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

в моем случае проблема заключалась в том, что мое приложение использовало веб-службы, и я также не экстернализовал JAX-WS. Приложение началось с использования com.солнце.XML.связывать.П2.классы времени выполнения, но когда он начал работать с файлом WSDL, внутренний JAX-WS попытался вызвать com.солнце.XML.внутренние.связывать.П2.классы времени выполнения. Ошибка исчезла, когда я загрузил и установил JAX-WS, и я смог продолжить обновление.


Я столкнулся с той же проблемой в одном из моих приложений. В моем случае проект использовал библиотеку, скомпилированную с совместимостью Java 1.5, в то время как основной проект имел совместимость с версией 1.6. Когда я изменил оба, чтобы использовать 1.6, проблема ушла. Я надеюсь, что это сможет помочь кому-то, так как проблема может быть довольно неприятной и трудно отслеживать.


принятое решение работало для меня, когда в Intellij, но я получил ту же ошибку при запуске maven из командной строки. Добавив в конфигурацию maven-surefire-plugin решил проблему и там:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <systemPropertyVariables>
                    <com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize>true</com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize>
                </systemPropertyVariables>
            </configuration>
        </plugin>

Я удалил зависимость от отдельного JAXB-impl jar из сборки.sbt. Теперь это работает.


У меня была аналогичная проблема, но у меня не было / нет проблемы с зависимостью(-version-mismatch).

в моем случае, класс не хватает @XmlAccessorType, добавление этой аннотации решило мою проблему. Адаптированный к вашему случаю, решение будет:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD) // check, if @XmlAccessorType is missing
public class GetClientByAccountResponse {
  ..

включение jaxbiimpl jar во время выполнения через диспетчер зависимостей в Родительском pom решит эту проблему. Это решение специфично для проектов maven.