【问题标题】:CXF DynamicWebservice client dateTIme converted to XMLGregorianCalendarCXF DynamicWebservice 客户端 dateTIme 转换为 XMLGregorianCalendar
【发布时间】:2016-10-05 13:21:00
【问题描述】:

我的 webservice 参数之一是 java.util.Date 类型,当我生成 CXF 动态 webservice 客户端时,由于 JAXB 的默认行为,它被转换为 XMLGregorianCalendar。但是,由于托管在服务器上的 web 服务需要一个 Date 对象,所以当调用实际的 web 服务时会抛出 ClassCastException。

Caused by: java.lang.ClassCastException: java.util.Date cannot be cast to javax.xml.datatype.XMLGregorianCalendar
    at *.*.CloseSet_WrapperTypeHelper1.createWrapperObject(Unknown Source)
    at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:103)
    ... 36 more

创建CXF Dynamic webservice客户端的代码如下:

private static JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory
            .newInstance();

...

private CachedClient getClient(String wsdlUrl) {
...
dcf.createClient(wsdlUrl, Arrays.asList(new String[]{"C:\\datebinding.xjb"}))
...
}

如果我使用 wsdl2java 工具创建类,使用相同的绑定文件,创建的类会将字段显示为 java.util.Date 类型

C:\>"c:\apache-cxf-2.2.12\apache-cxf-2.2.12\bin\wsdl2java" -b datebinding.xjb http://localhost:8080/MyWeb/MyService?wsdl

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "closeSet", propOrder = {
    "instanceId",
    "activationDate"
})
public class CloseSet {

    protected long instanceId;
    @XmlElement(type = String.class)
    @XmlJavaTypeAdapter(Adapter1 .class)
    @XmlSchemaType(name = "dateTime")
    protected Date activationDate;

如果绑定文件被删除

C:\>"c:\apache-cxf-2.2.12\apache-cxf-2.2.12\bin\wsdl2java" http://localhost:8080/MyWeb/MyService?wsdl

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "closeSet", propOrder = {
    "instanceId",
    "activationDate"
})
public class CloseSet {

    protected long instanceId;
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar activationDate;

所以我怀疑我的自定义绑定文件没有被 CXF 动态客户端获取。

pom.xml 中的 CXF/JAXB 依赖项

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-core</artifactId>
    <version>2.2.12</version>
</dependency>

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-ws-security</artifactId>
    <version>2.2.12</version>
</dependency>

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.2.12</version>
</dependency>

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.2.12</version>
</dependency>

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-xjc</artifactId>
    <version>2.1</version>
</dependency>

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
</dependency>

Web 服务托管在服务器上

@WebService(endpointInterface = "com.*.*.configuration.IConfigWebService")
public class ConfigWebService

public void closeSet(long id, Date date)
            throws ObjectNotFoundException, DuplicateObjectException {

wsdl sn-p - http://localhost:8080/MyWeb/MyService?wsdl

<wsdl:definitions xmlns:ns1="http://ws.*.*.*.com" xmlns:ns2="http://cxf.apache.org/bindings/xformat" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.config.*.*.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ConfigWebServiceService" targetNamespace="http://impl.config.*.*.com/">
<wsdl:import location="http://localhost:8080/MyWeb/MyService?wsdl=IConfigWebService.wsdl" namespace="http://ws.*.*.*.com"></wsdl:import>
<wsdl:binding name="ConfigWebServiceServiceSoapBinding" type="ns1:IConfigWebService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="closeSet">
    <soap:operation soapAction="" style="document"/>
    <wsdl:input name="closeSet">
        <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output name="closeSetResponse">
        <soap:body use="literal"/>
    </wsdl:output>

http://localhost:8080/MyWeb/ConfigService?wsdl=IConfigWebService.wsdl

<wsdl:definitions xmlns:ns1="http://ws.*.*.*.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IConfigWebService" targetNamespace="http://ws.*.*.*.com">
    <wsdl:types>
        <xs:schema xmlns:tns="http://ws.*.*.*.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://ws.*.*.*.com">

            <xs:element name="closeSet" type="tns:closeSet"/>
            <xs:element name="closeSetResponse" type="tns:closeSetResponse"/>

            <xs:complexType name="closeSet">
                <xs:sequence>
                    <xs:element name="instanceId" type="xs:long"/>
                    <xs:element minOccurs="0" name="activationDate" type="xs:dateTime"/>
                </xs:sequence>
            </xs:complexType>

【问题讨论】:

  • 使用自定义绑定 java.sun.com/xml/ns/jaxb" xmlns:xs="w3.org/2001/XMLSchema"> java.sun.com/xml/ns/jaxb" xmlns:xs="w3.org/2001/XMLSchema">
  • 嗨,克里斯,感谢您格式化问题。 (这是我的第一篇文章;))

标签: cxf webservice-client jaxb2


【解决方案1】:

通过将工厂类从 JaxWsDynamicClientFactory 更改为 DynamicClientFactory,我能够生成将 datetime 字段映射到 java Date 的动态客户端。仍然不确定为什么它不适用于 JaxWsDynamicClientFactory ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多