使用any和anyType

时间:2019-05-17 15:32:56

标签: java soap jaxb wsdl jax-ws

我有一个带有模式的WSDL文件,该模式包含请求消息中的any元素以及anyType条目。该WSDL文件用于与不同的外部系统进行通信(仅作为客户端,在我这边没有创建端点),并且每个系统都有一些我需要处理的特长。此专业是WSDL文件不知道的xml元素,我不想为添加的每个新xml元素实际触摸WSDL文件。我只想添加包含外部系统定义的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也是如此。在搜索问题时,我发现许多人实际上是在使用JAXBContext整理简单的POJO,他们不得不将相应的类添加到上下文中并完成。不幸的是,在使用生成的WSDL服务时,我无法访问JAXBContext(或者是吗?)。

这个意图的行为是我实际上不能在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
}

0 个答案:

没有答案