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

Java Soap请求数据丢失,[value:null]而不是实值,java,soap,wsdl,Java,Soap,Wsdl,我使用以下方法创建了web服务: findOrders(Set<Filter>) 我发出请求: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:kul="myKul"> <soapenv:Header/> <soapenv:Body> <kul:findOrders> &

我使用以下方法创建了web服务:

findOrders(Set<Filter>)
我发出请求:

<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>

submitter.username
等于
一些价值

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

这是因为someValue是“xs:anyType”,在java中表示为Object

AnyType是一种既可以表示simpleType也可以表示complexType的类型,您对它没有任何限制。
例如,它下面可以有一个树结构

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

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

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

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

您可以做的一件事是在xml文件中专门定义一个字符串,如下所示:

<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*/
}
<value xsi:type="xs:string">someValue</value>
someValue

通过这种方式,在本例中明确定义了一个字符串,Jaxb将能够映射到正确的字符串类型,这是因为someValue是“xs:anyType”,在java中表示为Object

AnyType是一种既可以表示simpleType也可以表示complexType的类型,您对它没有任何限制。
例如,它下面可以有一个树结构

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

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

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

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

您可以做的一件事是在xml文件中专门定义一个字符串,如下所示:

<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*/
}
<value xsi:type="xs:string">someValue</value>
someValue

通过这种方式,在本例中明确定义了一个字符串,Jaxb将能够映射到正确的字符串类型,这是因为someValue是“xs:anyType”,在java中表示为Object

AnyType是一种既可以表示simpleType也可以表示complexType的类型,您对它没有任何限制。
例如,它下面可以有一个树结构

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

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

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

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

您可以做的一件事是在xml文件中专门定义一个字符串,如下所示:

<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*/
}
<value xsi:type="xs:string">someValue</value>
someValue

通过这种方式,在本例中明确定义了一个字符串,Jaxb将能够映射到正确的字符串类型,这是因为someValue是“xs:anyType”,在java中表示为Object

AnyType是一种既可以表示simpleType也可以表示complexType的类型,您对它没有任何限制。
例如,它下面可以有一个树结构

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

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

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

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

您可以做的一件事是在xml文件中专门定义一个字符串,如下所示:

<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*/
}
<value xsi:type="xs:string">someValue</value>
someValue

通过这种方式,在本例中明确定义您有一个字符串,Jaxb将能够映射到正确的字符串类型

感谢您的反应:)。我的XSD模式是生成的,所以类型anyType是自动分配的,因为属性“value”的类型是Object。我无法更改类过滤器,因为它在系统的其他部分中使用。所以,我可能必须找到解决办法。那么,您真的需要对象类型的值,而不是更具体的值吗?因为无论如何,在某个时刻,如果你真的期望值来自任何类型,你需要以不同的方式对待这些类型,或者以一种通用的方式对待它们。强制生成XSD的另一个方法是在过滤器java类上使用注释:@xmlement@XmlSchemaType(name=“string”)私有对象值;这将强制生成值为xs:string的XSD。请别忘了投票,如果我的答案正确回答了你的问题,请将我的答案标记为“解决”