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

10-08 01:54