java - JAX-WS返回空元素

标签 java web-services jax-ws

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

产品具有以下属性:

  • ID
  • 姓名
  • 描述
  • 等等

描述的值为 String 或 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

最佳答案

问题在于计算机无法判断您希望将 null 序列化为字符串“NULL”;这对于计算机来说根本不明显。 (这对您的客户来说也不会很明显。)因此,计算机以默认的 JAXB 方式处理 null:它忽略该元素。

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

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

@XmlElement(required=true, nillable=true)
<小时/>

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

关于java - JAX-WS返回空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13298208/

相关文章:

java - 有没有办法检查一个类是否有一个方法,然后在该对象的一个​​已经存在的实例上调用它?

java - Android SIP 注册失败 (-9 IN_PROGRESS)

java - 手动处理 SOAP/JAX-WS 请求

java - 如何防止浏览器访问 CXF 安全 Web 服务

java - 带有继承的双向一对多不起作用(jpa 与 hibernate 3.5.4)

java - Spring:使用事务性数据库方法处理长时间运行的 Web 服务调用的最佳方式?

Java WebService线程创建

.net - 为什么我在尝试使用 HttpListener 时收到 "AccessDenied"?

c# - Web API - 事件通知

java - JAX-WS 序列化为流