JAX-WS返回空元素

时间:2012-11-08 21:34:30

标签: java web-services jax-ws

我使用JAX-WS并返回产品实体的列表。

产品具有以下属性:

  • id
  • 姓名
  • description

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

这是响应的转储:

<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

1 个答案:

答案 0 :(得分:2)

问题是计算机无法告诉您要将null序列化为字符串“NULL”;这对计算机来说并不明显。 (对于您的客户来说也不会显而易见。)因此,计算机以默认的JAXB方式处理null:它省略了元素。

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

这会在description字段(或getDescription()方法)上添加这样的注释:

@XmlElement(required=true, nillable=true)

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

相关问题