我正在开发一个web服务,它像这样调用另一个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);
}
}