我的方法是网络服务:
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”时。属性类型和属性名称都可以。
答案 0 :(得分:3)
这是因为someValue是&#34; xs:anyType&#34;在java中表示为Object。
AnyType是一种可以表示simpleType或complexType的类型,并且您不会对其进行限制。
例如
你可以在它下面有一个树结构
<value>
<sometag>
<sometag2>
blabla
</sometag2>
</sometag>
</value>
由于Jaxb(我希望您使用jaxws-jaxb)并不知道您将拥有的对象类型,它将创建一种更通用的方式来表示它,因此将字段值的内容表示为DOM对象。
实际上它正确地反序列化了你的&#34; someValue&#34;但是并没有将它表示为String而是将其表示为DOM结构。如果你在你的应用程序中放入breakPoint并尝试进入值字段,你会看到一切都在那里。但是,确保DOM表示不太方便使用。
问题是为什么要使用xs:anyType,如果你只想在其中添加一些字符串?
你可以做的一件事是在xml文件中明确定义你在这个例子中有这样一个字符串:
<value xsi:type="xs:string">someValue</value>
这种方式明确定义了在这种情况下你有一个字符串,Jaxb将能够映射到正确的字符串类型