Как вы упомянули, у вас есть messageBody.setAny(value)
, что означает, что XSI:type
для MessageBody было установлено на anytype
. Это означает, что вы можете установить любой объект там, поскольку JAXB должен иметь возможность маршалировать его в контексте, определенном инструментом wsdl2java JAX-WS. Из сообщения об ошибке «Не удается найти DataContainer в Conext» кажется, что ваши классы DataContainer находятся не в том же контексте.
Вот обходной путь для этого, вы, вероятно, можете преобразовать свой объект DataContainer в JAXBElement<String>
(или, возможно, просто в String, но я не уверен, что это будет работать), а затем установить его в anyType. Таким образом, вы не получите Class, который не знает в контексте, так как String является базовым типом JAXB.
Я не знаю, как вы определили структуру вашего пакета, когда пытались использовать пункт 2 или 3, поэтому я делаю дикий удар здесь. Из сообщения об ошибке кажется, что ваш отдельно сгенерированный класс DataContainer находится не в том же пакете, что и Message и его подклассы. Попробуйте переместить ваш DataContainer и связанные с ним классы в тот же пакет, что и класс сообщений, и объедините два класса ObjectFactory вместе. Это должно позволить JAXB найти DataContainer в том же «контексте», что и Message.
Ошибка, вероятно, возникает, когда вы делаете фактический запрос, и JAXB выполняет маршалинг объектов для создания запроса (то есть JAX-WS внутренне вызывает службу JAXB Marshelling). В этом случае, когда вы сгенерировали клиент, JAXBContext был установлен на пакет, где класс сообщения.
Вот простое руководство, которое касается JAXBContext Marshaling и unmarshaling.
http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/JAXBUsing3.html
Также в соответствии с этим вы можете установить для anyType значение org.w3c.dom.Element, а не org.w3c.dom.Document