我使用JAX-WS并返回产品实体的列表。
产品具有以下属性:
描述的值为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
答案 0 :(得分:2)
问题是计算机无法告诉您要将null
序列化为字符串“NULL
”;这对计算机来说并不明显。 (对于您的客户来说也不会显而易见。)因此,计算机以默认的JAXB方式处理null
:它省略了元素。
如果您希望元素存在,则需要在ProductDTO
上使用JAXB注释来表明情况。你可能也想让元素成为可空的;虽然它不会完全转换为你所说的,但它至少应该做正确的事(你的客户应该能够应对)。
这会在description
字段(或getDescription()
方法)上添加这样的注释:
@XmlElement(required=true, nillable=true)
执行此操作的另一种方法是添加getDescription()
方法,该方法返回字符串"NULL"
,否则返回null
(否则返回实际值)。问题在于它可能会混淆数据库绑定层;通过合理地注释元素(并使用更好的序列化)来正确地完成工作可以减少痛苦。