我使用 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/