肥皂请求数据丢失,[value:null]而不是实际值

时间:2015-01-16 12:48:15

标签: java soap wsdl

我的方法是网络服务:

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”时。属性类型和属性名称都可以。

1 个答案:

答案 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将能够映射到正确的字符串类型