Подтвердить что ты не робот

Netbeans с JAXB Random ClassCastException.. не может быть добавлено в com.sun.xml.bind.v2.runtime.reflect.Accessor

Я загрузил сообщения 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

4b9b3361

Ответ 1

Решено с помощью следующего кода

@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

Ответ 2

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

В моем случае проблема заключалась в том, что мое приложение использовало веб-службы, и я не использовал внешний JAX-WS. Приложение начиналось с классов com.sun.xml.bind.v2.runtime, но когда он начал работать с WSDL файлом, внутренний JAX-WS пытался вызвать com.sun.xml. внутренний.bind.v2.runtime. Ошибка исчезла, когда я загрузил и установил JAX-WS, и я смог продолжить обновление.

Ответ 3

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

Ответ 4

Принятое решение работало для меня, когда в 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>

Ответ 5

Я удалил зависимость от отдельного jaxb-impl jar из build.sbt. Это работает сейчас.

Ответ 6

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