2016-10-05 10 views
0

Один из моих аргументов webservice имеет тип java.util.Date и когда я генерирую динамический клиент WebService CXF, из-за поведения JAXB по умолчанию его переводится в XMLGregorianCalendar. Однако, поскольку веб-служба, размещенная на сервере, ожидает объект Date, когда вызывается фактический веб-сервис ClassCastException.CXF DynamicWebservice client dateTIme преобразован в XMLGregorianCalendar

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 type

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.

CXF/JAXB зависимостей в pom.xml

<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> 

Webservice размещен на сервере

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

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

- фрагмент кода WSDL 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> 
+0

Используемое пользовательское связывание

+0

Привет, Крис, спасибо за форматирование вопроса. (Это мой первый пост ;)) –

ответ

0

Изменив фабричный класс от JaxWsDynamicClientFactory до DynamicClientFactory, я смог создать динамический клиент с полем datetime, сопоставленным с java Date. Все еще не уверен, почему он не работает с JaxWsDynamicClientFactory;)