Проблемы JAXBContext в сгенерированном клиенте веб-службы с any и anyType - PullRequest
0 голосов
/ 17 мая 2019

У меня есть файл WSDL со схемой, которая содержит элемент any, а также записи anyType в сообщении запроса.Этот файл WSDL используется для связи с различными внешними системами (в качестве только клиента, на моей стороне не создаются конечные точки), и у каждой системы есть свои особенности, с которыми мне приходится иметь дело.Эти особенности представляют собой элементы XML, о которых файл WSDL не знает, и я не хочу касаться файла WSDL для каждого нового добавляемого элемента XML.Я просто хочу добавить файлы xsd, содержащие определения для внешней системы, сгенерировать их и все готово.Следующее сообщение запроса является лишь примером, чтобы сделать его немного более понятным:

<xs:element name="RequestMessage" type='mns:RequestMessageType'/>
    <xs:complexType name="RequestMessageType">
        <xs:sequence>
            <xs:any namespace='##any' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
            <xs:element name='test' type="xs:anyType"/>
        </xs:sequence>
    <xs:anyAttribute namespace='##other' processContents='lax'/>
</xs:complexType>

Я сгенерировал службу и соответствующие классы с помощью плагина jaxws-maven-plugin.Теперь, когда я создаю экземпляр класса, определенного в файле WSDL или в любой из импортированных схем, это работает просто отлично.Но как только я захочу поместить что-либо в список any или как содержимое для anyType, который не является его частью, сериализатор завершит работу с одним из следующих сообщений:

1) Использование JAXBElement в виде обернутого типа(только любое):

Caused by: javax.xml.bind.JAXBException: com.example.mytypes._67890.SomeType is not known to this context

2) Использование необработанного типа (any и anyType):

javax.xml.bind.JAXBException: Class com.example.mytypes._67890.SomeType nor any of its super class is known to this context

Из того, что я понял, опция lax должна позволить мне бросать действительно любоетип, который правильно аннотирован в любом списке, и маршаллер выяснит, как на самом деле найти правильный контекст.То же самое относится к anyType по умолчанию.В поисках проблемы я нашел много людей, которые на самом деле собирали простые POJO, используя JAXBContext, и им пришлось добавить соответствующий класс в контекст, и все было готово.К сожалению, у меня нет доступа к JAXBContext при использовании сгенерированной службы WSDL (или нет?).

Это намеренное поведение, которое я действительно не могу поместить в элементы any и anyType, хотяклассы аннотированы и готовы к сериализации (классы, которые я пытался использовать, на самом деле также генерируются)?Если да, могу ли я как-то повлиять на это таким образом, чтобы я смог достичь того, что я хочу сделать?

Вот класс SomeType для справки:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SomeType", propOrder = {
    "myString",
    "anotherString"
})
public class SomeType {

    @XmlElement(required = true)
    protected String myString;
    @XmlElement(required = true)
    protected String anotherString;

    // omitted getters and setters for readability
}
...