我正在开发一个像以下那样调用另一个的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
,但我稍后会进行大量计算,而我并不想解析所有时间。
答案 0 :(得分:1)
通过拥有自己的自定义编组/解组逻辑可以解决问题。在上面的场景中,<myFloat>.</myFloat>
中的数据被格式化为float,没有任何预验证检查。
我们可以为请求/响应的特定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);
}
}