将特殊字符解析为float类型的默认值



我正在开发一个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);
    }
}

最新更新