Soap 请求数据丢失,[value: null] 而不是真实值

Soap request data lost, [value: null] instead real value

我有网络服务方法:

findOrders(Set<Filter>)

过滤器在 XSD 架构中定义如下:

<xs:complexType name="filter">
<xs:sequence>
<xs:element name="propertyName" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="type" type="tns:filterType" minOccurs="0"></xs:element>
<xs:element name="value" type="xs:anyType" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

对象过滤器如下所示:

class Filter implements Serializable {

private String propertyName;
private FilterType type;
private Object value;

/*getters setters*/
}

我正在发送请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:kul="myKul">
   <soapenv:Header/>
   <soapenv:Body>
      <kul:findOrders>
         <filters>
            <propertyName>submitter.username</propertyName>
            <type>Equals</type>
            <value>someValue</value>
         </filters>
      </kul:findOrders>
   </soapenv:Body>
</soapenv:Envelope>

但是当我的应用程序中的读取请求时,我看到属性值包含“[value: null]”而不是 "someValue"。属性 type 和 propertyName 都可以。

因为someValue是"xs:anyType",在java中表示为Object。

AnyType 是一种既可以表示简单类型也可以表示复杂类型的类型,您对此没有任何限制。
例如你可以在它下面有一个树结构

<value>
    <sometag>
        <sometag2>
        blabla
        </sometag2>
    </sometag>
</value>

由于 Jaxb(我希望您使用 jaxws-jaxb)不知道您将在值中拥有的对象类型,它将创建一种更通用的方式来表示它,因此将字段值的内容表示为 DOM 个对象。

实际上它正确地反序列化了您的 "someValue" 但只是不将其表示为字符串而是表示为 DOM 结构。如果您在应用程序中放置 breakPoint 并尝试进入值字段,您会看到所有内容都在那里。但可以肯定的是 DOM 表示使用起来不太方便。

问题是,如果您只想在其中放入一些字符串,为什么要使用 xs:anyType?

你可以做的一件事是在 xml 文件中专门定义你在这种情况下的字符串,如下所示:

<value xsi:type="xs:string">someValue</value>

这样就明确定义了在这种情况下您有一个字符串,Jaxb 将能够映射到正确的字符串类型