我正在开发一个Web服务,它调用另一个这样的服务:
CalledService service = new CalledService();
CalledServicePortType portType = service.getCalledServicePort();
CalledServiceResult calledServiceResult = portType.getResults(request); //NumberFormatException here when dot is returned
当然,我想
getResults
将返回有效的CalledServiceResult
对象。我的
CalledServiceResult
(只是其中的一部分):@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CalledServiceResult", propOrder = {
//...
"myFloat"
})
public class CalledServiceResult{
//...
@XmlElement(name = "myFloat")
protected float myFloat;
//...
}
但是
CalledService
有时会返回:<myFloat>.</myFloat> <!-- dot instead of valid float -->
其中在标记行上包含
NumberFormatException
。这是明显的CalledService's
错误,但是可以说我无法更改(它是由外部公司开发的)。如何修改我的
CalledServiceResult
类以使其适应这种情况?当0.0
返回myFloat
时,我想在CalledService
变量中包含. (dot)
还有一件事,明显的解决方案是将
myFloat
类型更改为String
,但是我稍后要进行大量计算,所以我不想一直解析它。 最佳答案
可以通过拥有自己的自定义封送/拆送逻辑来解决该问题。在上述情况下,<myFloat>.</myFloat>
中的数据被格式化为浮点型,而没有任何预验证检查。
我们可以为请求/响应的特定xml元素提供自己的封送处理和取消封送处理实现。我们要做的就是编写一个扩展XmlAdapter的类,通过该类我们将在marshal()和unmarshall()方法中提供必要的逻辑。我们可以使用注释XmlJavaTypeAdapter将此适配器类映射到属性。
这就是您的CalledServiceResult
现在的样子,
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CalledServiceResult", propOrder = {
//...
"myFloat"
})
public class CalledServiceResult{
//...
@XmlElement(name = "myFloat")
@XmlJavaTypeAdapter(MyFloatAdapter.class)
protected float myFloat;
//...
}
public class MyFloatAdapter extends XmlAdapter<String, Float> {
@Override
public String marshal(Float myFloat) throws Exception {
return Float.toString(myFloat);
}
@Override
public Float unmarshal(String myFloatString) throws Exception {
return (myFloatString == ".") ? 0.0 : Float.parseFloat(myFloatString);
}
}