为CXF包装原语

时间:2012-03-11 00:09:29

标签: java web-services cxf

我有时需要通过Web服务发送基元列表,例如作为运行存储过程的参数。在Java中基本上我有List。这不适用于CXF。我最终做了List,其中SimpleDataItem是附加代码。这是一个好主意,还是有更好的方法?

我基本上执行的功能我希望如下:

ResultSet executeStoredProc(String procName, Object... args) throws SQLException;

现在SimpleDataItem看起来像这样:

public class SimpleDataItem {
    private String s;
    private Long l;
    private Integer i;
    private BigDecimal d;
    private Boolean b;
    private Long t;
    private byte[] ba;



    public SimpleDataItem() {

    }

    public SimpleDataItem(Object o) {
        doSetObject(o);
    }

    public void doSetObject(Object o) {
        if (o==null) {
            return;
        }
        if (o instanceof String ) {
            s=(String)o;
            return;
        }
        if (o instanceof Long ) {
            l=(Long)o;
            return;
        }
        if (o instanceof Integer ) {
            i=(Integer)o;
            return;
        }
        if (o instanceof BigDecimal) {
            d=(BigDecimal)o;
            return ;
        }

        if (o instanceof Boolean) {
            b=(Boolean)o;
            return ;
        }
        if (o instanceof Timestamp) {
            t=((Timestamp)o).getTime();
            return;
        }
        if (o instanceof byte[]) {
            ba=(byte[])o;
        }

    }

    public Object doGetObject() {
        if (s!=null) {
            return s;
        }
        if (l!=null) {
            return l;
        }
        if (i!=null) {
            return i;
        }
        if (d!=null) {
            return d;
        }
        if (b!=null) {
            return b;
        }
        if (t!=null) {
            return new Timestamp(t);
        }
        if (ba!=null) {
            return ba;
        }
        return null;
    }

    /**
     * @return the ba
     */
    public byte[] getBa() {
        return ba;
    }

    /**
     * @param ba the ba to set
     */
    public void setBa(byte[] ba) {
        this.ba = ba;
    }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

    public Long getL() {
        return l;
    }

    public void setL(Long l) {
        this.l = l;
    }

    public Integer getI() {
        return i;
    }

    public void setI(Integer i) {
        this.i = i;
    }

    public BigDecimal getD() {
        return d;
    }

    public void setD(BigDecimal d) {
        this.d = d;
    }

    public Boolean getB() {
        return b;
    }

    public void setB(Boolean b) {
        this.b = b;
    }

    public Long getT() {
        return t;
    }

    public void setT(Long t) {
        this.t = t;
    }

    public String toString() {
        Object o=doGetObject();
        if (o!=null) {
            return o.toString();
        }
        return null;
    }   
}

这是个好主意吗?是否有更好的方法?

1 个答案:

答案 0 :(得分:1)

这不是CXF问题,而是Web服务问题。您正在尝试发送多态数据结构。因此,您需要一个使用可能类型的XML Schema联合的模式。

请参阅JAXB - Unmarshalling polymorphic objects