You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by "Segal, Jeffrey" <Je...@solers.com> on 2007/11/01 21:31:19 UTC
Migrating XFire/Aegis inheritance to CXF
I'd like to bump the question posed a few weeks ago by Nalyd (see
http://www.nabble.com/Aegis-inheritance-tf4668138.html#a13335122).
I am attempting to ensure that some additional classes which are not
present in my service interfaces get bound along with the others, a
common problem given a service such as:
public void queue(Job job);
where there exists the following classes:
public class BigJob extends Job { ... }
public class SmallJob extends Job {...}
In this case, Job will be bound to XML elements, but BigJob and SmallJob
will not. XFire does support this, documented at
http://xfire.codehaus.org/Aegis+Inheritance. However, I cannot find a
similar piece of documentation on porting this solution to CXF. It
seems as if the support is all still there but not necessarily exposed
(see http://cwiki.apache.org/CXF20DOC/aegis-theory-of-operation.html).
I have played around with a few things in my Spring configuration, such
as adding something like this to my ServiceFactoryBean:
<bean id='jaxws-and-aegis-service-factory'
class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
...
<property name="properties">
<map>
<entry key="writeXsiType">
<value type="java.lang.Boolean">true</value>
</entry>
<entry key="overrideTypesList">
<list>
<value>com.foo.bar.BigJob</value>
<value>com.foo.bar.SmallJob</value>
</list>
</entry>
</map>
</property>
...
</bean>
This deploys without error, but my WSDL and corresponding stubs do not
include the overridden types. Any ideas?
Thanks!
Jeff
RE: Migrating XFire/Aegis inheritance to CXF
Posted by InJeNiErO <pa...@gmail.com>.
Hi again,
Finally I managed to configure the client to react to the inheritance.
I have to configure the ReflectionServiceFactoryBean of the
ClientProxyFactoryBean with the same properties map I have used to configure
the Server Side.
Client Code:
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
Map props = new HashMap();
List list = new ArrayList();
list.add(DummySon.class.getName());
props.put("writeXsiType", Boolean.TRUE);
props.put("overrideTypesList", list);
factory.getServiceFactory().setProperties(props);
factory.setDataBinding(new AegisDatabinding());
factory.setServiceClass(GetDummyWS.class);
factory.setAddress("http://localhost:8080/services/GetDummy");
GetDummyWS client = (GetDummyWS)factory.create();
Dummy dummy = (Dummy) client.doService();
DummySon dummyson = (DummySon) dummy;
System.out.println("SonField:" +dummySon.getSonField());
InJeNiErO
InJeNiErO wrote:
>
> Hi,
>
> I managed to configure the simple frontend to produce a WSDL with
> inheritance using AEGIS, but I can't make the client to work with the
> inheritance, it throws a ClassCastException when trying to cast to the
> childClass.
>
> Here is my spring configuration:
>
> <bean id="aegisBean"
> class="org.apache.cxf.aegis.databinding.AegisDatabinding"
> scope="prototype" />
> <bean id="simple-and-aegis-service-factory"
> class="org.apache.cxf.service.factory.ReflectionServiceFactoryBean"
> scope="prototype">
> <property name="dataBinding" ref="aegisBean" />
> <property name="serviceConfigurations">
> <list>
> <bean
> class="org.apache.cxf.service.factory.DefaultServiceConfiguration" />
> <bean
> class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration" />
> </list>
> </property>
> <property name="properties">
> <map>
> <entry key="writeXsiType">
> <value type="java.lang.Boolean">true</value>
> </entry>
> <entry key="overrideTypesList">
> <list>
> <value>testapplication.model.DummySon</value>
> <value>testapplication.model.DummyGrandSon</value>
> </list>
> </entry>
> </map>
> </property>
> </bean>
>
> <simple:server id="getDummyWS"
> serviceClass="testapplication.ws.GetDummyWS" address="/GetDummy"
> serviceBean="#getDummyWSImp">
> <simple:serviceFactory>
> <ref bean="simple-and-aegis-service-factory" />
> </simple:serviceFactory>
> </simple:server>
>
> And the GetDummyWSImp Cass:
>
> public class GetDummyWSImp implements GetDummyWS{
> public Dummy doService(String name){
> DummySon ds = new DummySon();
> ds.setBirth(new Date(2001,10,14));
> ds.setCode(new Long(45));
> ds.setName(name);
> ds.setSonField("sondField");
> return ds;
> }
> }
>
> And the Dummy, DummySon and DummyGrandSon classes:
>
> public class Dummy {
> private String name;
> private Long code;
> private Date birth;
> (plus getter and setters)
> }
> public class DummySon extends Dummy {
> private String sonField;
> (plus getter and setters)
> }
> public class DummyGrandSon extends DummySon {
> private String grandSonField;
> (plus getter and setters)
> }
>
> And finally the WSDL:
>
> <?xml version="1.0" encoding="utf-8"?><wsdl:definitions
> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
> xmlns:tns="http://ws.testapplication/"
> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="GetDummyWS"
> targetNamespace="http://ws.testapplication/">
> <wsdl:types>
> <xsd:schema xmlns:tns="http://model.testapplication"
> attributeFormDefault="qualified" elementFormDefault="qualified"
> targetNamespace="http://model.testapplication">
> <xsd:complexType name="DummyGrandSon">
> <xsd:complexContent>
> <xsd:extension base="tns:DummySon">
> <xsd:sequence>
> <xsd:element minOccurs="0" name="grandSonField"
> nillable="true" type="xsd:string"/>
> </xsd:sequence>
> </xsd:extension>
> </xsd:complexContent>
> </xsd:complexType>
> <xsd:complexType name="DummySon">
> <xsd:complexContent>
> <xsd:extension base="tns:Dummy">
> <xsd:sequence>
> <xsd:element minOccurs="0" name="sonField"
> nillable="true" type="xsd:string"/>
> </xsd:sequence>
> </xsd:extension>
> </xsd:complexContent>
> </xsd:complexType>
> <xsd:complexType name="Dummy">
> <xsd:sequence>
> <xsd:element minOccurs="0" name="birth" type="xsd:dateTime"/>
> <xsd:element minOccurs="0" name="code" nillable="true"
> type="xsd:long"/>
> <xsd:element minOccurs="0" name="name" nillable="true"
> type="xsd:string"/>
> </xsd:sequence>
> </xsd:complexType>
> </xsd:schema>
> <xsd:schema xmlns:ns0="http://model.testapplication"
> attributeFormDefault="unqualified" elementFormDefault="qualified"
> targetNamespace="http://ws.testapplication/">
> <xsd:element name="doService" type="tns:doService"/>
> <xsd:complexType name="doService">
> <xsd:sequence>
> <xsd:element minOccurs="0" name="arg0" type="xsd:string"/>
> </xsd:sequence>
> </xsd:complexType>
> <xsd:element name="doServiceResponse" type="tns:doServiceResponse"/>
> <xsd:complexType name="doServiceResponse">
> <xsd:sequence>
> <xsd:element minOccurs="0" name="return" type="ns0:Dummy"/>
> </xsd:sequence>
> </xsd:complexType>
> </xsd:schema>
> </wsdl:types>
> <wsdl:message name="doService">
> <wsdl:part element="tns:doService" name="parameters">
> </wsdl:part>
> </wsdl:message>
> <wsdl:message name="doServiceResponse">
> <wsdl:part element="tns:doServiceResponse" name="parameters">
> </wsdl:part>
> </wsdl:message>
> <wsdl:portType name="GetDummyWSPortType">
> <wsdl:operation name="doService">
> <wsdl:input message="tns:doService" name="doService">
> </wsdl:input>
> <wsdl:output message="tns:doServiceResponse"
> name="doServiceResponse">
> </wsdl:output>
> </wsdl:operation>
> </wsdl:portType>
> <wsdl:binding name="GetDummyWSSoapBinding"
> type="tns:GetDummyWSPortType">
> <soap:binding style="document"
> transport="http://schemas.xmlsoap.org/soap/http"/>
> <wsdl:operation name="doService">
> <soap:operation soapAction="" style="document"/>
> <wsdl:input name="doService">
> <soap:body use="literal"/>
> </wsdl:input>
> <wsdl:output name="doServiceResponse">
> <soap:body use="literal"/>
> </wsdl:output>
> </wsdl:operation>
> </wsdl:binding>
> <wsdl:service name="GetDummyWS">
> <wsdl:port binding="tns:GetDummyWSSoapBinding" name="GetDummyWSPort">
> <soap:address location="http://localhost:8080/services/GetDummy"/>
> </wsdl:port>
> </wsdl:service>
> </wsdl:definitions>
>
> InJeNiErO.
>
>>I pessimistically think that you've found a bug. Could you please drop
>>this into JIRA?
>
>> -----Original Message-----
>> From: Segal, Jeffrey [mailto:Jeffrey.Segal@solers.com]
>> Sent: Thursday, November 01, 2007 4:31 PM
>> To: cxf-user@incubator.apache.org
>> Subject: Migrating XFire/Aegis inheritance to CXF
>>
>> I'd like to bump the question posed a few weeks ago by Nalyd (see
>> http://www.nabble.com/Aegis-inheritance-tf4668138.html#a13335122).
>>
>> I am attempting to ensure that some additional classes which are not
>> present in my service interfaces get bound along with the others, a
>> common problem given a service such as:
>>
>> public void queue(Job job);
>>
>> where there exists the following classes:
>>
>> public class BigJob extends Job { ... }
>> public class SmallJob extends Job {...}
>>
>> In this case, Job will be bound to XML elements, but BigJob and
> SmallJob
>> will not. XFire does support this, documented at
>> http://xfire.codehaus.org/Aegis+Inheritance. However, I cannot find a
>> similar piece of documentation on porting this solution to CXF. It
>> seems as if the support is all still there but not necessarily exposed
>> (see http://cwiki.apache.org/CXF20DOC/aegis-theory-of-operation.html).
>>
>> I have played around with a few things in my Spring configuration,
> such
>> as adding something like this to my ServiceFactoryBean:
>>
>> <bean id='jaxws-and-aegis-service-factory'
>> class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
>> ...
>> <property name="properties">
>> <map>
>> <entry key="writeXsiType">
>> <value type="java.lang.Boolean">true</value>
>> </entry>
>> <entry key="overrideTypesList">
>> <list>
>> <value>com.foo.bar.BigJob</value>
>> <value>com.foo.bar.SmallJob</value>
>> </list>
>> </entry>
>> </map>
>> </property>
>> ...
>> </bean>
>>
>> This deploys without error, but my WSDL and corresponding stubs do not
>> include the overridden types. Any ideas?
>>
>> Thanks!
>> Jeff
>
>
--
View this message in context: http://www.nabble.com/Migrating-XFire-Aegis-inheritance-to-CXF-tp13536859p15413115.html
Sent from the cxf-user mailing list archive at Nabble.com.
RE: Migrating XFire/Aegis inheritance to CXF
Posted by InJeNiErO <pa...@gmail.com>.
Hi,
I managed to configure the simple frontend to produce a WSDL with
inheritance using AEGIS, but I can't make the client to work with the
inheritance, it throws a ClassCastException when trying to cast to the
childClass.
Here is my spring configuration:
<bean id="aegisBean"
class="org.apache.cxf.aegis.databinding.AegisDatabinding" scope="prototype"
/>
<bean id="simple-and-aegis-service-factory"
class="org.apache.cxf.service.factory.ReflectionServiceFactoryBean"
scope="prototype">
<property name="dataBinding" ref="aegisBean" />
<property name="serviceConfigurations">
<list>
<bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"
/>
<bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"
/>
</list>
</property>
<property name="properties">
<map>
<entry key="writeXsiType">
<value type="java.lang.Boolean">true</value>
</entry>
<entry key="overrideTypesList">
<list>
<value>testapplication.model.DummySon</value>
<value>testapplication.model.DummyGrandSon</value>
</list>
</entry>
</map>
</property>
</bean>
<simple:server id="getDummyWS" serviceClass="testapplication.ws.GetDummyWS"
address="/GetDummy"
serviceBean="#getDummyWSImp">
<simple:serviceFactory>
<ref bean="simple-and-aegis-service-factory" />
</simple:serviceFactory>
</simple:server>
And the GetDummyWSImp Cass:
public class GetDummyWSImp implements GetDummyWS{
public Dummy doService(String name){
DummySon ds = new DummySon();
ds.setBirth(new Date(2001,10,14));
ds.setCode(new Long(45));
ds.setName(name);
ds.setSonField("sondField");
return ds;
}
}
And the Dummy, DummySon and DummyGrandSon classes:
public class Dummy {
private String name;
private Long code;
private Date birth;
(plus getter and setters)
}
public class DummySon extends Dummy {
private String sonField;
(plus getter and setters)
}
public class DummyGrandSon extends DummySon {
private String grandSonField;
(plus getter and setters)
}
And finally the WSDL:
<?xml version="1.0" encoding="utf-8"?><wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://ws.testapplication/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="GetDummyWS"
targetNamespace="http://ws.testapplication/">
<wsdl:types>
<xsd:schema xmlns:tns="http://model.testapplication"
attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://model.testapplication">
<xsd:complexType name="DummyGrandSon">
<xsd:complexContent>
<xsd:extension base="tns:DummySon">
<xsd:sequence>
<xsd:element minOccurs="0" name="grandSonField"
nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="DummySon">
<xsd:complexContent>
<xsd:extension base="tns:Dummy">
<xsd:sequence>
<xsd:element minOccurs="0" name="sonField"
nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Dummy">
<xsd:sequence>
<xsd:element minOccurs="0" name="birth" type="xsd:dateTime"/>
<xsd:element minOccurs="0" name="code" nillable="true"
type="xsd:long"/>
<xsd:element minOccurs="0" name="name" nillable="true"
type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<xsd:schema xmlns:ns0="http://model.testapplication"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://ws.testapplication/">
<xsd:element name="doService" type="tns:doService"/>
<xsd:complexType name="doService">
<xsd:sequence>
<xsd:element minOccurs="0" name="arg0" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="doServiceResponse" type="tns:doServiceResponse"/>
<xsd:complexType name="doServiceResponse">
<xsd:sequence>
<xsd:element minOccurs="0" name="return" type="ns0:Dummy"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="doService">
<wsdl:part element="tns:doService" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="doServiceResponse">
<wsdl:part element="tns:doServiceResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="GetDummyWSPortType">
<wsdl:operation name="doService">
<wsdl:input message="tns:doService" name="doService">
</wsdl:input>
<wsdl:output message="tns:doServiceResponse" name="doServiceResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="GetDummyWSSoapBinding" type="tns:GetDummyWSPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="doService">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="doService">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="doServiceResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GetDummyWS">
<wsdl:port binding="tns:GetDummyWSSoapBinding" name="GetDummyWSPort">
<soap:address location="http://localhost:8080/services/GetDummy"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
InJeNiErO.
>I pessimistically think that you've found a bug. Could you please drop
>this into JIRA?
> -----Original Message-----
> From: Segal, Jeffrey [mailto:Jeffrey.Segal@solers.com]
> Sent: Thursday, November 01, 2007 4:31 PM
> To: cxf-user@incubator.apache.org
> Subject: Migrating XFire/Aegis inheritance to CXF
>
> I'd like to bump the question posed a few weeks ago by Nalyd (see
> http://www.nabble.com/Aegis-inheritance-tf4668138.html#a13335122).
>
> I am attempting to ensure that some additional classes which are not
> present in my service interfaces get bound along with the others, a
> common problem given a service such as:
>
> public void queue(Job job);
>
> where there exists the following classes:
>
> public class BigJob extends Job { ... }
> public class SmallJob extends Job {...}
>
> In this case, Job will be bound to XML elements, but BigJob and
SmallJob
> will not. XFire does support this, documented at
> http://xfire.codehaus.org/Aegis+Inheritance. However, I cannot find a
> similar piece of documentation on porting this solution to CXF. It
> seems as if the support is all still there but not necessarily exposed
> (see http://cwiki.apache.org/CXF20DOC/aegis-theory-of-operation.html).
>
> I have played around with a few things in my Spring configuration,
such
> as adding something like this to my ServiceFactoryBean:
>
> <bean id='jaxws-and-aegis-service-factory'
> class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
> ...
> <property name="properties">
> <map>
> <entry key="writeXsiType">
> <value type="java.lang.Boolean">true</value>
> </entry>
> <entry key="overrideTypesList">
> <list>
> <value>com.foo.bar.BigJob</value>
> <value>com.foo.bar.SmallJob</value>
> </list>
> </entry>
> </map>
> </property>
> ...
> </bean>
>
> This deploys without error, but my WSDL and corresponding stubs do not
> include the overridden types. Any ideas?
>
> Thanks!
> Jeff
--
View this message in context: http://www.nabble.com/Migrating-XFire-Aegis-inheritance-to-CXF-tp13536859p15412041.html
Sent from the cxf-user mailing list archive at Nabble.com.
RE: Migrating XFire/Aegis inheritance to CXF
Posted by Benson Margulies <bi...@basistech.com>.
I pessimistically think that you've found a bug. Could you please drop
this into JIRA?
> -----Original Message-----
> From: Segal, Jeffrey [mailto:Jeffrey.Segal@solers.com]
> Sent: Thursday, November 01, 2007 4:31 PM
> To: cxf-user@incubator.apache.org
> Subject: Migrating XFire/Aegis inheritance to CXF
>
> I'd like to bump the question posed a few weeks ago by Nalyd (see
> http://www.nabble.com/Aegis-inheritance-tf4668138.html#a13335122).
>
> I am attempting to ensure that some additional classes which are not
> present in my service interfaces get bound along with the others, a
> common problem given a service such as:
>
> public void queue(Job job);
>
> where there exists the following classes:
>
> public class BigJob extends Job { ... }
> public class SmallJob extends Job {...}
>
> In this case, Job will be bound to XML elements, but BigJob and
SmallJob
> will not. XFire does support this, documented at
> http://xfire.codehaus.org/Aegis+Inheritance. However, I cannot find a
> similar piece of documentation on porting this solution to CXF. It
> seems as if the support is all still there but not necessarily exposed
> (see http://cwiki.apache.org/CXF20DOC/aegis-theory-of-operation.html).
>
> I have played around with a few things in my Spring configuration,
such
> as adding something like this to my ServiceFactoryBean:
>
> <bean id='jaxws-and-aegis-service-factory'
> class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
> ...
> <property name="properties">
> <map>
> <entry key="writeXsiType">
> <value type="java.lang.Boolean">true</value>
> </entry>
> <entry key="overrideTypesList">
> <list>
> <value>com.foo.bar.BigJob</value>
> <value>com.foo.bar.SmallJob</value>
> </list>
> </entry>
> </map>
> </property>
> ...
> </bean>
>
> This deploys without error, but my WSDL and corresponding stubs do not
> include the overridden types. Any ideas?
>
> Thanks!
> Jeff