Один из моих аргументов 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>
Используемое пользовательское связывание JXB: globalBindings> JXB: переплеты> JXB: привязок > –
Привет, Крис, спасибо за форматирование вопроса. (Это мой первый пост ;)) –