ClassCastException: не может быть добавлено в com.sun.xml.internal.bind.v2.runtime.reflect.Accessor

У меня есть веб-сервис SOAP, который я пытаюсь вызвать внутри приложения. Я использую cxf-codegen-plugin (3.1.10) для генерации источников из WSDL.

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

Например, следующее отлично работает:

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

Однако инициализация нового экземпляра JAXB прямо перед вызовом getOutboundServicePort() для отказа:

JAXBContext.newInstance(SendMessageRequest.class);

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

С помощью следующей команды stacktrace:

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

Вещи, которые я пробовал до сих пор:

классы JAXB из ошибки маршаллинга Webservice

  • У меня нет одобренных банок в папке JDK, поэтому этот ответ не применяется
  • Jaxb-impl jar (2.2.11) исходит от camel-jaxb в моем приложении, поэтому он кажется очень содержащимся и не похож на этот ответ.
  • Этот ответ, похоже, хорошо описывает проблему, но решение, которое они приняли, кажется мне непонятным.

Проблемы с созданием JAXBContext для маршалирования объекта как XML

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

Netbeans с JAXB Случайное исключение ClassCastException.. не будет передано в com.sun.xml.bind.v2.runtime.reflect.Accessor

  • Я пробовал принятое решение System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");, которое работает. Однако установка этого свойства не является для меня вариантом, к сожалению, в моей среде. Плюс, кажется, что это немного взломать, что не затрагивает реальную проблему (если я не понимаю ее).

Я собираюсь повеситься с маленькой веревкой, которую я оставил. Что мне здесь не хватает?

Ответ 1

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

Корневая проблема заключалась в том, что jaxb-impl jar, приводимый camel-jaxb, противоречил версии, предоставленной JDK 8.

Этот ответ описывает, что происходит более четко:

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

В моем случае я просто исключил jaxb-impl, который пришел с camel-jaxb, и приложение начало работать правильно.

Ответ 2

Я сталкиваюсь с той же проблемой в области тестирования. Для меня добавление jaxws-rt runtime jar помогло. Обратите внимание, что я добавил его только для моей тестовой области. Вы не собираетесь делать это для среды выполнения prod, поскольку предполагается, что в контейнере JEE уже есть эта или другая реализация.

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2.3</version>
    <scope>test</scope>
</dependency>

Ответ 3

Я столкнулся с этой ошибкой при попытке запустить свои тесты JUnit через Maven, даже если они проходили локально в Eclipse. Мое решение было в @BeforeClass поставить:

System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");

Ответ 4

У меня недостаточно репутации, чтобы комментировать, но хочу подчеркнуть, что раннее простое исправление - это круто. Исключите "jaxb-impl, который пришел с camel-jaxb". Моя ошибка была

java.lang.ClassCastException: 
...defbase.DataResponse$JaxbAccessorM_getMessages_setMessages_java_util_List 
cannot be cast to com.sun.xml.internal.bind.v2.runtime.reflect.Accessor