cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Kulp <dk...@apache.org>
Subject Re: How the inheritance in java is supported in SOAP and RESTful services by using cxf
Date Fri, 08 Jun 2012 14:12:21 GMT
On Thursday, June 07, 2012 10:59:50 AM Diana ALLAM wrote:
> Hello,
> 
> Using @XmlSeeAlso annotation works only for my Restful example but not for
> the SOAP one. Can I conclude that it is impossible to include Java
> inheritance in SOAP but it is possible for REST?

It should also be working in SOAP, strange.  Can you try moving/adding 
additional @XmlSeeAlso annotations in various extra places as a test to see 
if putting it someplace else would allow it to get picked up.   Definitely 
stick it on the Person class as a starter, the SEI interface (if you have 
one), etc...  

Also, make sure both the Person and the Student classes have BOTH an 
@XmlRootElement and a @XmlType, both with name attributes set.  In general, 
the inheritance works on the Type, not the Element, so there needs to be 
named types generated, not anonymous types in the element.


Dan



> 
> 
> Diana
> 
> On 6 juin 2012, at 18:39, Daniel Kulp wrote:
> > If you add an @XmlSeeAlso annotation that points to the Student class,
> > then JAXB (and thus CXF) can pick up the Student class and it will
> > appear the schema and would properly be transfered on the wire with the
> > appropriate xsi:type attribute.
> > 
> > You can add it to the Person class (so the Person knows about it's
> > subclasses) or you can add it to the Service class
> > 
> > @XmlSeeAlso({Student.class})
> > public class Service  {
> > 
> > 	public String print(Person p){
> > 	
> > 		return p.info();
> > 	
> > 	}
> > 
> > }
> > 
> > And CXF will pick it up.
> > 
> > Dan
> > 
> > On Tuesday, June 05, 2012 08:46:39 AM dallam wrote:
> >> Hello,
> >> 
> >> I have the following simple java Class which I would like to publish as
> >> a
> >> web service:
> >> 
> >> -----------------------------------------------------------------------
> >> --- ------------ public class Service  {
> >> 
> >> 	public String print(Person p){
> >> 	
> >> 		return p.info();
> >> 	
> >> 	}
> >> 
> >> }
> >> -----------------------------------------------------------------------
> >> --- ------------ I have also two classes, "Person" and its subclass
> >> "Student" which define differently the "info()" method:
> >> -----------------------------------------------------------------------
> >> --- ---------- public class Person {
> >> 
> >> 	private String name;
> >> 	
> >> 	public Person() {
> >> 	
> >> 		this.name = "diana";
> >> 	
> >> 	}
> >> 	
> >> 	public String info(){
> >> 	
> >> 		return "this is a person, his name is " + this.name;
> >> 	
> >> 	}
> >> 	
> >> 	public String getName(){
> >> 	
> >> 		return this.name;
> >> 	
> >> 	}
> >> 	
> >> 	public void setName(String name){
> >> 	
> >> 		this.name = name;
> >> 	
> >> 	}
> >> 
> >> }
> >> -----------------------------------------------------------------------
> >> --- ---------- public class Student extends Person{
> >> 
> >> private String school;
> >> 
> >> 	public Student() {
> >> 	
> >>                super();
> >> 		
> >> 		this.school="emn";
> >> 	
> >> 	}
> >> 	
> >> 	public String info(){
> >> 	
> >> 		return "this is a student, his name is " + this.getName() + " 
from
> > 
> > the
> > 
> >> school of " + this.school;
> >> 
> >> 	}
> >> 	
> >> 	public String getSchool(){
> >> 	
> >> 		return this.school;
> >> 	
> >> 	}
> >> 	
> >> 	public void setSchool(String school){
> >> 	
> >> 		this.school = school;
> >> 	
> >> 	}
> >> 
> >> }
> >> -----------------------------------------------------------------------
> >> --- -------------------------------------------
> >> 
> >> The problem is by using jaxws, I didn't find the way to build a client
> >> which would like to call the print service with a student object. Only
> >> "person" objects are accepted.
> >> Is there a way to do that in cxf?
> >> 
> >> The same is for JaxRS by using annotations.
> >> For example, if I have the following post method:
> >> ---------------------------------------------------------
> >> @POST
> >> 
> >>    @Path("/persons/")
> >>    public Response addPerson(Person p) {  ... }
> >> 
> >> ---------------------------------------------------------
> >> and I annotated the person class with:
> >> @XmlRootElement(name = "Person")
> >> 
> >> and the Student class which extends Person is annotated with:
> >> @XmlRootElement(name = "Student")
> >> 
> >> 
> >> I can't send to the post method an XML with a "Student" root element
> >> because only "Person" root element is accepted.
> >> 
> >> Is there an inheritance annotation in cxf to solve this problem? if
> >> not,
> >> why this issue is not considered
> >> in the implementation of the cxf framework?
> >> 
> >> 
> >> Best regards,
> >> 
> >> Diana
> >> 
> >> 
> >> 
> >> --
> >> View this message in context:
> >> http://cxf.547215.n5.nabble.com/How-the-inheritance-in-java-is-supporte
> >> d-
> >> in-SOAP-and-RESTful-services-by-using-cxf-tp5709127.html Sent from the
> >> cxf-user mailing list archive at Nabble.com.
-- 
Daniel Kulp
dkulp@apache.org - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com


Mime
View raw message