1

我使用 JAX-WS,它返回产品实体列表。

产品具有以下属性:

  • ID
  • 姓名
  • 描述
  • 等等

描述有值 String 或 null。我调试的产品列表和描述值是有效的。当描述为空时,描述元素不包含在 SOAP 响应中。我想在具有 NULL 值的 SOAP 响应中使用此元素。

这是响应转储:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getProductsResponse xmlns:ns2="http://blabla.com/">
         <return>
            <idProduct>1</idProduct>
            <name>name</name>
            <description>some desc</description>
         </return>
         <return>
            <idProduct>2</idProduct>
            <name>name</name>
         </return>
      </ns2:getProductsResponse>
   </S:Body>
</S:Envelope>

我想:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getProductsResponse xmlns:ns2="http://blabla.com/">
         <return>
            <idProduct>1</idProduct>
            <name>name</name>
            <description>some desc</description>
         </return>
         <return>
            <idProduct>2</idProduct>
            <name>name</name>
            <description>NULL</description>
         </return>
      </ns2:getProductsResponse>
   </S:Body>
</S:Envelope>

这是我的网络方法:

@WebMethod(operationName = "getProducts")
public List<ProductDTO> getProducts(@WebParam(name = "idCompany") int idCompany) {
        ProductHelper helper = new ProductHelper();
        // this list was debuged and it is correct
        List<ProductDTO> products = helper.getAll(idCompany);
        return products;
}

我使用 JAX-WS RI 2.2-hudson-740

4

1 回答 1

3

问题是计算机无法判断您希望将 anull序列化为字符串“<code>NULL”;这对计算机来说一点也不明显。(这对您的客户来说也不会很明显。)因此,计算机null以默认的 JAXB 方式处理:它省略了元素。

如果您希望元素存在,则需要在 上使用 JAXB 注释ProductDTO来说明情况就是如此。您可能还想让元素为空;虽然它不会完全转换为您所说的您正在寻找的内容,但它至少应该做正确的事情(并且您的客户应该能够应对)。

这将在description字段(或getDescription()方法)上放置这样的注释:

@XmlElement(required=true, nillable=true)

另一种方法是添加一个getDescription()方法,该方法返回字符串"NULL",否则它会返回 a null(否则返回实际值)。这样做的问题是它可能会混淆您的数据库绑定层;通过合理地注释元素(并使用更好的序列化)正确地完成工作会导致更少的痛苦。

于 2012-11-08T22:00:52.133 回答