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 将能够映射到正确的字符串类型
我有网络服务方法:
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 将能够映射到正确的字符串类型