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

时间:2015-08-26 07:35:33

标签: java parsing jaxb numberformatexception

我正在开发一个像以下那样调用另一个的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,但我稍后会进行大量计算,而我并不想解析所有时间。

1 个答案:

答案 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);
    }
}