You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Ayush Gupta <ay...@inquisant.com> on 2008/02/27 00:07:02 UTC

Does CXF Support Interfaces as Web Params?

In my web service, there is a method which takes an interface as its
parameter, instead of a concrete class. Reference code is at the bottom of
this email.

 

When I run the client, I get an exception "Caused by:
javax.xml.bind.JAXBException: com.passenger.test.ComplexObjectInterface is
not known to this context". Further investigation and digging through the
CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which is called
while building the JAXBContext. The code in JAXBUtils. getValidClass
explicitly excludes inclusion of any interfaces! I also tried setting the
XmlJavaTypeAdapter on the interface but that didn't work.

 

So, does CXF Support Interfaces as Web Params? I'd appreciate anyone
throwing some light on this!

 

Thanks

-ayush

 

 

Web Service Interface:

public interface TestServiceInterface {

    public void testMethod(MyInterface param);

}

 

Parameter Interface:

public interface MyInterface{

    String getText();

    void setText(String t);

}

 

 

Parameter concrete class:

public class MyClass implements MyInterface {

    private String text;

    

    public String getText() {

        return text;

    }

    

    public void setText(String t) {

        this.text = t;

    }

}

 

Client:

    Service service = Service.create(SERVICE_NAME);

    service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
ENDPOINT_ADDRESS);

    TestServiceInterface  serviceInterface  =
service.getPort(TestServiceInterface.class);

    serviceInterface. testMethod(new MyClass());

 

 


Re: Does CXF Support Interfaces as Web Params?

Posted by Daniel Kulp <dk...@apache.org>.
On Wednesday 27 February 2008, Ayush Gupta wrote:
> Yes, I've used JAXB with interfaces and its painful but does work.
>
> However, it appears from the code in JAXBUtils that CXF explicitly
> excludes interfaces even if they are annotated to be properly
> marshaled by JAXB (as per
> https://jaxb.dev.java.net/guide/Mapping_interfaces.html)

Fixable....   I'll try to get that fixed tomorrow.   :-)

Dan



>
> -----Original Message-----
> From: jim ma [mailto:mail2jimma@gmail.com]
> Sent: Tuesday, February 26, 2008 9:18 PM
> To: cxf-user@incubator.apache.org
> Subject: Re: Does CXF Support Interfaces as Web Params?
>
> Kohsuke Kawaguchi's blog talked about this , you can get some
> information from
> this link:
> http://weblogs.java.net/blog/kohsuke/archive/2006/06/jaxb_and_interf.h
>tml
>
> On Wed, Feb 27, 2008 at 9:25 AM, Glen Mazza <gl...@verizon.net> 
wrote:
> > I think the answer is "no", neither CXF nor GlassFish Metro support
> > interfaces as parameters.  It's either a JAX-WS or JAXB rule, I'm
> > not certain.
> >
> > Glen
> >
> > Am Dienstag, den 26.02.2008, 15:07 -0800 schrieb Ayush Gupta:
> > > In my web service, there is a method which takes an interface as
> > > its parameter, instead of a concrete class. Reference code is at
> > > the bottom
> >
> > of
> >
> > > this email.
> > >
> > >
> > >
> > > When I run the client, I get an exception "Caused by:
> > > javax.xml.bind.JAXBException:
>
> com.passenger.test.ComplexObjectInterfaceis
>
> > > not known to this context". Further investigation and digging
> > > through
> >
> > the
> >
> > > CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which
> > > is
> >
> > called
> >
> > > while building the JAXBContext. The code in JAXBUtils.
> > > getValidClass explicitly excludes inclusion of any interfaces! I
> > > also tried setting
> >
> > the
> >
> > > XmlJavaTypeAdapter on the interface but that didn't work.
> > >
> > >
> > >
> > > So, does CXF Support Interfaces as Web Params? I'd appreciate
> > > anyone throwing some light on this!
> > >
> > >
> > >
> > > Thanks
> > >
> > > -ayush
> > >
> > >
> > >
> > >
> > >
> > > Web Service Interface:
> > >
> > > public interface TestServiceInterface {
> > >
> > >     public void testMethod(MyInterface param);
> > >
> > > }
> > >
> > >
> > >
> > > Parameter Interface:
> > >
> > > public interface MyInterface{
> > >
> > >     String getText();
> > >
> > >     void setText(String t);
> > >
> > > }
> > >
> > >
> > >
> > >
> > >
> > > Parameter concrete class:
> > >
> > > public class MyClass implements MyInterface {
> > >
> > >     private String text;
> > >
> > >
> > >
> > >     public String getText() {
> > >
> > >         return text;
> > >
> > >     }
> > >
> > >
> > >
> > >     public void setText(String t) {
> > >
> > >         this.text = t;
> > >
> > >     }
> > >
> > > }
> > >
> > >
> > >
> > > Client:
> > >
> > >     Service service = Service.create(SERVICE_NAME);
> > >
> > >     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
> > > ENDPOINT_ADDRESS);
> > >
> > >     TestServiceInterface  serviceInterface  =
> > > service.getPort(TestServiceInterface.class);
> > >
> > >     serviceInterface. testMethod(new MyClass());



-- 
J. Daniel Kulp
Principal Engineer, IONA
dkulp@apache.org
http://www.dankulp.com/blog

Re: Does CXF Support Interfaces as Web Params?

Posted by Benson Margulies <bi...@gmail.com>.
Aegis has interface support. You can specify a map from Class<?> to class
name that maps interface classes to proxy class names, and it will create
objects of the proxy types.

On Wed, Feb 27, 2008 at 10:15 PM, Daniel Kulp <dk...@apache.org> wrote:

> On Wednesday 27 February 2008, Ayush Gupta wrote:
> > Yes, I've used JAXB with interfaces and its painful but does work.
> >
> > However, it appears from the code in JAXBUtils that CXF explicitly
> > excludes interfaces even if they are annotated to be properly
> > marshaled by JAXB (as per
> > https://jaxb.dev.java.net/guide/Mapping_interfaces.html)
>
> Actually, that code IS correct.   I've been experimenting with this quite
> a bit tonight and JAXB will barf if you try to create a context with any
> class that is an interface, even if the interface has the
> XmlJavaTypeAdapter annotation on it and such.   Thus, that code is
> correct.   However, this also means that you cannot use interfaces
> for "top level"  things, only for stuff within actual concrete beans.
>
> That said, I was pleasantly suprised when I wrote my test case that the
> test actually worked with whats on the trunk today PROVIDING you have a
> valid version of asm jar available AND you use wrapped doc/lit.   With
> the work I did two weeks ago, in the wrapped doc/lit case, it will use
> ASM to buildup concrete beans in memory and the interface params get put
> over just fine and they work.   (This is on the 2.1 line only.  Way to
> complex to port back to 2.0.x.)
>
> If you AREN'T using wrapped doc/lit or you don't have an asm jar
> available, then there are issues.  We have to drop down to JAXB
> proprietary API's and types to get them to work.   That's not going to
> be easy and due to the extra book keeping, is going to be a performance
> issue.    In general, I strongly suggest the wrapped doc/lit with asm.
>
> In anycase, I'm adding a sample of this to the java_first_jaxws sample to
> kind of show it working.   I'll start a new snapshot deploy before I
> head to bed tonight so the 2.1 snapshots in the morning should have it.
> I'd really appreciate it if folks could look at it and let me know how
> to improve the sample to show some more of these complex scenarios.   I
> do admit most of our samples are very basic.  This should be a step in
> the right direction for providing something a bit more complex.
>
> Dan
>
>
> >
> >
> > -----Original Message-----
> > From: jim ma [mailto:mail2jimma@gmail.com]
> > Sent: Tuesday, February 26, 2008 9:18 PM
> > To: cxf-user@incubator.apache.org
> > Subject: Re: Does CXF Support Interfaces as Web Params?
> >
> > Kohsuke Kawaguchi's blog talked about this , you can get some
> > information from
> > this link:
> > http://weblogs.java.net/blog/kohsuke/archive/2006/06/jaxb_and_interf.h
> >tml
> >
> > On Wed, Feb 27, 2008 at 9:25 AM, Glen Mazza <gl...@verizon.net>
> wrote:
> > > I think the answer is "no", neither CXF nor GlassFish Metro support
> > > interfaces as parameters.  It's either a JAX-WS or JAXB rule, I'm
> > > not certain.
> > >
> > > Glen
> > >
> > > Am Dienstag, den 26.02.2008, 15:07 -0800 schrieb Ayush Gupta:
> > > > In my web service, there is a method which takes an interface as
> > > > its parameter, instead of a concrete class. Reference code is at
> > > > the bottom
> > >
> > > of
> > >
> > > > this email.
> > > >
> > > >
> > > >
> > > > When I run the client, I get an exception "Caused by:
> > > > javax.xml.bind.JAXBException:
> >
> > com.passenger.test.ComplexObjectInterfaceis
> >
> > > > not known to this context". Further investigation and digging
> > > > through
> > >
> > > the
> > >
> > > > CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which
> > > > is
> > >
> > > called
> > >
> > > > while building the JAXBContext. The code in JAXBUtils.
> > > > getValidClass explicitly excludes inclusion of any interfaces! I
> > > > also tried setting
> > >
> > > the
> > >
> > > > XmlJavaTypeAdapter on the interface but that didn't work.
> > > >
> > > >
> > > >
> > > > So, does CXF Support Interfaces as Web Params? I'd appreciate
> > > > anyone throwing some light on this!
> > > >
> > > >
> > > >
> > > > Thanks
> > > >
> > > > -ayush
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Web Service Interface:
> > > >
> > > > public interface TestServiceInterface {
> > > >
> > > >     public void testMethod(MyInterface param);
> > > >
> > > > }
> > > >
> > > >
> > > >
> > > > Parameter Interface:
> > > >
> > > > public interface MyInterface{
> > > >
> > > >     String getText();
> > > >
> > > >     void setText(String t);
> > > >
> > > > }
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Parameter concrete class:
> > > >
> > > > public class MyClass implements MyInterface {
> > > >
> > > >     private String text;
> > > >
> > > >
> > > >
> > > >     public String getText() {
> > > >
> > > >         return text;
> > > >
> > > >     }
> > > >
> > > >
> > > >
> > > >     public void setText(String t) {
> > > >
> > > >         this.text = t;
> > > >
> > > >     }
> > > >
> > > > }
> > > >
> > > >
> > > >
> > > > Client:
> > > >
> > > >     Service service = Service.create(SERVICE_NAME);
> > > >
> > > >     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
> > > > ENDPOINT_ADDRESS);
> > > >
> > > >     TestServiceInterface  serviceInterface  =
> > > > service.getPort(TestServiceInterface.class);
> > > >
> > > >     serviceInterface. testMethod(new MyClass());
>
>
>
> --
> J. Daniel Kulp
> Principal Engineer, IONA
> dkulp@apache.org
> http://www.dankulp.com/blog
>

Re: Does CXF Support Interfaces as Web Params?

Posted by Daniel Kulp <dk...@apache.org>.
On Wednesday 27 February 2008, Ayush Gupta wrote:
> Yes, I've used JAXB with interfaces and its painful but does work.
>
> However, it appears from the code in JAXBUtils that CXF explicitly
> excludes interfaces even if they are annotated to be properly
> marshaled by JAXB (as per
> https://jaxb.dev.java.net/guide/Mapping_interfaces.html)

Actually, that code IS correct.   I've been experimenting with this quite 
a bit tonight and JAXB will barf if you try to create a context with any 
class that is an interface, even if the interface has the 
XmlJavaTypeAdapter annotation on it and such.   Thus, that code is 
correct.   However, this also means that you cannot use interfaces 
for "top level"  things, only for stuff within actual concrete beans.  

That said, I was pleasantly suprised when I wrote my test case that the 
test actually worked with whats on the trunk today PROVIDING you have a 
valid version of asm jar available AND you use wrapped doc/lit.   With 
the work I did two weeks ago, in the wrapped doc/lit case, it will use 
ASM to buildup concrete beans in memory and the interface params get put 
over just fine and they work.   (This is on the 2.1 line only.  Way to 
complex to port back to 2.0.x.)

If you AREN'T using wrapped doc/lit or you don't have an asm jar 
available, then there are issues.  We have to drop down to JAXB 
proprietary API's and types to get them to work.   That's not going to 
be easy and due to the extra book keeping, is going to be a performance 
issue.    In general, I strongly suggest the wrapped doc/lit with asm.

In anycase, I'm adding a sample of this to the java_first_jaxws sample to 
kind of show it working.   I'll start a new snapshot deploy before I 
head to bed tonight so the 2.1 snapshots in the morning should have it.   
I'd really appreciate it if folks could look at it and let me know how 
to improve the sample to show some more of these complex scenarios.   I 
do admit most of our samples are very basic.  This should be a step in 
the right direction for providing something a bit more complex.

Dan


>
>
> -----Original Message-----
> From: jim ma [mailto:mail2jimma@gmail.com]
> Sent: Tuesday, February 26, 2008 9:18 PM
> To: cxf-user@incubator.apache.org
> Subject: Re: Does CXF Support Interfaces as Web Params?
>
> Kohsuke Kawaguchi's blog talked about this , you can get some
> information from
> this link:
> http://weblogs.java.net/blog/kohsuke/archive/2006/06/jaxb_and_interf.h
>tml
>
> On Wed, Feb 27, 2008 at 9:25 AM, Glen Mazza <gl...@verizon.net> 
wrote:
> > I think the answer is "no", neither CXF nor GlassFish Metro support
> > interfaces as parameters.  It's either a JAX-WS or JAXB rule, I'm
> > not certain.
> >
> > Glen
> >
> > Am Dienstag, den 26.02.2008, 15:07 -0800 schrieb Ayush Gupta:
> > > In my web service, there is a method which takes an interface as
> > > its parameter, instead of a concrete class. Reference code is at
> > > the bottom
> >
> > of
> >
> > > this email.
> > >
> > >
> > >
> > > When I run the client, I get an exception "Caused by:
> > > javax.xml.bind.JAXBException:
>
> com.passenger.test.ComplexObjectInterfaceis
>
> > > not known to this context". Further investigation and digging
> > > through
> >
> > the
> >
> > > CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which
> > > is
> >
> > called
> >
> > > while building the JAXBContext. The code in JAXBUtils.
> > > getValidClass explicitly excludes inclusion of any interfaces! I
> > > also tried setting
> >
> > the
> >
> > > XmlJavaTypeAdapter on the interface but that didn't work.
> > >
> > >
> > >
> > > So, does CXF Support Interfaces as Web Params? I'd appreciate
> > > anyone throwing some light on this!
> > >
> > >
> > >
> > > Thanks
> > >
> > > -ayush
> > >
> > >
> > >
> > >
> > >
> > > Web Service Interface:
> > >
> > > public interface TestServiceInterface {
> > >
> > >     public void testMethod(MyInterface param);
> > >
> > > }
> > >
> > >
> > >
> > > Parameter Interface:
> > >
> > > public interface MyInterface{
> > >
> > >     String getText();
> > >
> > >     void setText(String t);
> > >
> > > }
> > >
> > >
> > >
> > >
> > >
> > > Parameter concrete class:
> > >
> > > public class MyClass implements MyInterface {
> > >
> > >     private String text;
> > >
> > >
> > >
> > >     public String getText() {
> > >
> > >         return text;
> > >
> > >     }
> > >
> > >
> > >
> > >     public void setText(String t) {
> > >
> > >         this.text = t;
> > >
> > >     }
> > >
> > > }
> > >
> > >
> > >
> > > Client:
> > >
> > >     Service service = Service.create(SERVICE_NAME);
> > >
> > >     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
> > > ENDPOINT_ADDRESS);
> > >
> > >     TestServiceInterface  serviceInterface  =
> > > service.getPort(TestServiceInterface.class);
> > >
> > >     serviceInterface. testMethod(new MyClass());



-- 
J. Daniel Kulp
Principal Engineer, IONA
dkulp@apache.org
http://www.dankulp.com/blog

RE: Does CXF Support Interfaces as Web Params?

Posted by Ayush Gupta <ay...@inquisant.com>.
Yes, I've used JAXB with interfaces and its painful but does work. 

However, it appears from the code in JAXBUtils that CXF explicitly excludes
interfaces even if they are annotated to be properly marshaled by JAXB (as
per https://jaxb.dev.java.net/guide/Mapping_interfaces.html)


-----Original Message-----
From: jim ma [mailto:mail2jimma@gmail.com] 
Sent: Tuesday, February 26, 2008 9:18 PM
To: cxf-user@incubator.apache.org
Subject: Re: Does CXF Support Interfaces as Web Params?

Kohsuke Kawaguchi's blog talked about this , you can get some information
from
this link:
http://weblogs.java.net/blog/kohsuke/archive/2006/06/jaxb_and_interf.html

On Wed, Feb 27, 2008 at 9:25 AM, Glen Mazza <gl...@verizon.net> wrote:

> I think the answer is "no", neither CXF nor GlassFish Metro support
> interfaces as parameters.  It's either a JAX-WS or JAXB rule, I'm not
> certain.
>
> Glen
>
> Am Dienstag, den 26.02.2008, 15:07 -0800 schrieb Ayush Gupta:
> > In my web service, there is a method which takes an interface as its
> > parameter, instead of a concrete class. Reference code is at the bottom
> of
> > this email.
> >
> >
> >
> > When I run the client, I get an exception "Caused by:
> > javax.xml.bind.JAXBException:
com.passenger.test.ComplexObjectInterfaceis
> > not known to this context". Further investigation and digging through
> the
> > CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which is
> called
> > while building the JAXBContext. The code in JAXBUtils. getValidClass
> > explicitly excludes inclusion of any interfaces! I also tried setting
> the
> > XmlJavaTypeAdapter on the interface but that didn't work.
> >
> >
> >
> > So, does CXF Support Interfaces as Web Params? I'd appreciate anyone
> > throwing some light on this!
> >
> >
> >
> > Thanks
> >
> > -ayush
> >
> >
> >
> >
> >
> > Web Service Interface:
> >
> > public interface TestServiceInterface {
> >
> >     public void testMethod(MyInterface param);
> >
> > }
> >
> >
> >
> > Parameter Interface:
> >
> > public interface MyInterface{
> >
> >     String getText();
> >
> >     void setText(String t);
> >
> > }
> >
> >
> >
> >
> >
> > Parameter concrete class:
> >
> > public class MyClass implements MyInterface {
> >
> >     private String text;
> >
> >
> >
> >     public String getText() {
> >
> >         return text;
> >
> >     }
> >
> >
> >
> >     public void setText(String t) {
> >
> >         this.text = t;
> >
> >     }
> >
> > }
> >
> >
> >
> > Client:
> >
> >     Service service = Service.create(SERVICE_NAME);
> >
> >     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
> > ENDPOINT_ADDRESS);
> >
> >     TestServiceInterface  serviceInterface  =
> > service.getPort(TestServiceInterface.class);
> >
> >     serviceInterface. testMethod(new MyClass());
> >
> >
> >
> >
> >
>
>


Re: Does CXF Support Interfaces as Web Params?

Posted by jim ma <ma...@gmail.com>.
Kohsuke Kawaguchi's blog talked about this , you can get some information
from
this link:
http://weblogs.java.net/blog/kohsuke/archive/2006/06/jaxb_and_interf.html

On Wed, Feb 27, 2008 at 9:25 AM, Glen Mazza <gl...@verizon.net> wrote:

> I think the answer is "no", neither CXF nor GlassFish Metro support
> interfaces as parameters.  It's either a JAX-WS or JAXB rule, I'm not
> certain.
>
> Glen
>
> Am Dienstag, den 26.02.2008, 15:07 -0800 schrieb Ayush Gupta:
> > In my web service, there is a method which takes an interface as its
> > parameter, instead of a concrete class. Reference code is at the bottom
> of
> > this email.
> >
> >
> >
> > When I run the client, I get an exception "Caused by:
> > javax.xml.bind.JAXBException: com.passenger.test.ComplexObjectInterfaceis
> > not known to this context". Further investigation and digging through
> the
> > CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which is
> called
> > while building the JAXBContext. The code in JAXBUtils. getValidClass
> > explicitly excludes inclusion of any interfaces! I also tried setting
> the
> > XmlJavaTypeAdapter on the interface but that didn't work.
> >
> >
> >
> > So, does CXF Support Interfaces as Web Params? I'd appreciate anyone
> > throwing some light on this!
> >
> >
> >
> > Thanks
> >
> > -ayush
> >
> >
> >
> >
> >
> > Web Service Interface:
> >
> > public interface TestServiceInterface {
> >
> >     public void testMethod(MyInterface param);
> >
> > }
> >
> >
> >
> > Parameter Interface:
> >
> > public interface MyInterface{
> >
> >     String getText();
> >
> >     void setText(String t);
> >
> > }
> >
> >
> >
> >
> >
> > Parameter concrete class:
> >
> > public class MyClass implements MyInterface {
> >
> >     private String text;
> >
> >
> >
> >     public String getText() {
> >
> >         return text;
> >
> >     }
> >
> >
> >
> >     public void setText(String t) {
> >
> >         this.text = t;
> >
> >     }
> >
> > }
> >
> >
> >
> > Client:
> >
> >     Service service = Service.create(SERVICE_NAME);
> >
> >     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
> > ENDPOINT_ADDRESS);
> >
> >     TestServiceInterface  serviceInterface  =
> > service.getPort(TestServiceInterface.class);
> >
> >     serviceInterface. testMethod(new MyClass());
> >
> >
> >
> >
> >
>
>

Re: Does CXF Support Interfaces as Web Params?

Posted by Glen Mazza <gl...@verizon.net>.
I think the answer is "no", neither CXF nor GlassFish Metro support
interfaces as parameters.  It's either a JAX-WS or JAXB rule, I'm not
certain.

Glen

Am Dienstag, den 26.02.2008, 15:07 -0800 schrieb Ayush Gupta:
> In my web service, there is a method which takes an interface as its
> parameter, instead of a concrete class. Reference code is at the bottom of
> this email.
> 
>  
> 
> When I run the client, I get an exception "Caused by:
> javax.xml.bind.JAXBException: com.passenger.test.ComplexObjectInterface is
> not known to this context". Further investigation and digging through the
> CXF code bought me to JAXBUtils. getValidClass(Class<?> cls) which is called
> while building the JAXBContext. The code in JAXBUtils. getValidClass
> explicitly excludes inclusion of any interfaces! I also tried setting the
> XmlJavaTypeAdapter on the interface but that didn't work.
> 
>  
> 
> So, does CXF Support Interfaces as Web Params? I'd appreciate anyone
> throwing some light on this!
> 
>  
> 
> Thanks
> 
> -ayush
> 
>  
> 
> 
> 
> Web Service Interface:
> 
> public interface TestServiceInterface {
> 
>     public void testMethod(MyInterface param);
> 
> }
> 
>  
> 
> Parameter Interface:
> 
> public interface MyInterface{
> 
>     String getText();
> 
>     void setText(String t);
> 
> }
> 
>  
> 
> 
> 
> Parameter concrete class:
> 
> public class MyClass implements MyInterface {
> 
>     private String text;
> 
>     
> 
>     public String getText() {
> 
>         return text;
> 
>     }
> 
>     
> 
>     public void setText(String t) {
> 
>         this.text = t;
> 
>     }
> 
> }
> 
>  
> 
> Client:
> 
>     Service service = Service.create(SERVICE_NAME);
> 
>     service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
> ENDPOINT_ADDRESS);
> 
>     TestServiceInterface  serviceInterface  =
> service.getPort(TestServiceInterface.class);
> 
>     serviceInterface. testMethod(new MyClass());
> 
>  
> 
> 
>