You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Fatemeh Chitforoush <ch...@gmail.com> on 2008/08/03 11:18:35 UTC

Re: Service Interface Extension in CXF

Thanx for your reply.

I changed the implementation as you said:

@WebService
@XmlSeeAlso({XChild.class})
public interface ChildServiceInterface extends  ParentServiceInterface{
     @WebMethod
     public String[] getXList();
}

and now, there is no exception during tomcat start-up, but as I call the
service from client, this exception is thrown by JAXB:
javax.xml.bind.JAXBException : XChild is not known to this context !!!!

Don't you know the solution?!

-- fatemeh


dkulp wrote:
> 
> 
> This is doable, but requires a little bit more setup....
> 
> First, the method signature must stay the same as what's in the  
> interface.   It needs to stay:
> public X[] getXList();
> We only invoke on the actual method object defined from the interface.
> 
> The key issue is getting the XChild classes available to JAXB.  The  
> EASIEST way to do that is to add an annotation to the Interface:
> @XmlSeeAlso({XChild.class})
> (might be able to add it to the impl instead, not really sure)
> 
> Dan
> 
> 
> 
> On Jul 30, 2008, at 4:15 AM, Fatemeh Chitforoush wrote:
> 
>>
>> Hi,
>>
>> Thanx for your reply :)
>> BTW, I'm using Spring too, and I think maybe the problem relates to  
>> the
>> service implementor, which returns XChild instead of X! In fact,  
>> this part
>> is not covered in your sample test :S Actually i need inherited  
>> services to
>> return objects of different classes (which also extends X)! What do  
>> you
>> think?!
>>
>> -- fatemeh
>>
>>
>> Arul Dhesiaseelan wrote:
>>>
>>> Basically, you override base interface method in  
>>> ChildServiceInterface.
>>> So, this should work by all means.
>>>
>>> I know for sure this works standalone CXF. I haven't tested in a  
>>> servlet
>>> container.
>>>
>>> Here is my standalone test, in case if you are interested.
>>>
>>> public interface ParentServiceInterface {
>>>  public String[] getXList();
>>> }
>>>
>>> @WebService
>>> public interface ChildServiceInterface extends  
>>> ParentServiceInterface{
>>>       @WebMethod
>>>       public String[] getXList();
>>> }
>>>
>>> public class ChildServiceImpl implements ChildServiceInterface {
>>>       public String[] getXList(){
>>>            return new String[] {"child"};
>>>       }
>>> }
>>>
>>> public class Server {
>>>  public static void main(String args[]) {
>>>    System.out.println("Starting Server");
>>>    ChildServiceImpl implementor = new ChildServiceImpl();
>>>    String address = "http://localhost:9000/child";
>>>    Endpoint.publish(address, implementor);
>>>  }
>>> }
>>>
>>> public class Client {
>>>  public static void main(String args[]) {
>>>    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
>>>    factory.setServiceClass(ChildServiceInterface.class);
>>>    factory.setAddress("http://localhost:9000/child");
>>>
>>>    ChildServiceInterface client =
>>> (ChildServiceInterface)factory.create();
>>>    System.out.println("Invoke getXList()....");
>>>    System.out.println(client.getXList()[0]);
>>>    System.exit(0);
>>>
>>>  }
>>> }
>>>
>>> HTH.
>>>
>>> Cheers,
>>> Arul
>>>
>>> Fatemeh Chitforoush wrote:
>>>> Hi,
>>>>
>>>> Does CXF support inheritance in service interfaces?
>>>> I want to have a common interface for a number of services, so I  
>>>> have a
>>>> parent interface, and all my service interfaces extend this parent
>>>> interface. When i try to fire up tomcat, this exception is thrown:
>>>> An opration  "an operation with name [] already exists in this  
>>>> service.
>>>> Does CXF support what I want?
>>>>
>>>> Sample code:
>>>> public interface ParentServiceInterface {
>>>>      public X[] getXList();
>>>> }
>>>>
>>>> public interface ChildServiceInterface extends  
>>>> ParentServiceInterface{
>>>>       @WebMethod
>>>>       public X[] getXList();
>>>> }
>>>>
>>>> public class ChildServiceImpl implements ChildServiceInterface {
>>>>       public XChild[] getXList(){
>>>>            .......
>>>>       }
>>>> }
>>>>
>>>> public class XChild extends X{
>>>> ......
>>>> }
>>>>
>>>>
>>>
>>>
>>>
>>>
>>
>> -- 
>> View this message in context:
>> http://www.nabble.com/Service-Interface-Extension-in-CXF-tp18708779p18728166.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>>
> 
> ---
> Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
> 
> 
> 
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Service-Interface-Extension-in-CXF-tp18708779p18797074.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: Service Interface Extension in CXF

Posted by Daniel Kulp <dk...@apache.org>.
As long as everything meets the rules for JAXB, that should have worked.   If 
not, you'll probably need to create a small example that shows it failing so 
we can dig into it to see why.

Dan


On Sunday 03 August 2008 5:18:35 am Fatemeh Chitforoush wrote:
> Thanx for your reply.
>
> I changed the implementation as you said:
>
> @WebService
> @XmlSeeAlso({XChild.class})
> public interface ChildServiceInterface extends  ParentServiceInterface{
>      @WebMethod
>      public String[] getXList();
> }
>
> and now, there is no exception during tomcat start-up, but as I call the
> service from client, this exception is thrown by JAXB:
> javax.xml.bind.JAXBException : XChild is not known to this context !!!!
>
> Don't you know the solution?!
>
> -- fatemeh
>
> dkulp wrote:
> > This is doable, but requires a little bit more setup....
> >
> > First, the method signature must stay the same as what's in the
> > interface.   It needs to stay:
> > public X[] getXList();
> > We only invoke on the actual method object defined from the interface.
> >
> > The key issue is getting the XChild classes available to JAXB.  The
> > EASIEST way to do that is to add an annotation to the Interface:
> > @XmlSeeAlso({XChild.class})
> > (might be able to add it to the impl instead, not really sure)
> >
> > Dan
> >
> > On Jul 30, 2008, at 4:15 AM, Fatemeh Chitforoush wrote:
> >> Hi,
> >>
> >> Thanx for your reply :)
> >> BTW, I'm using Spring too, and I think maybe the problem relates to
> >> the
> >> service implementor, which returns XChild instead of X! In fact,
> >> this part
> >> is not covered in your sample test :S Actually i need inherited
> >> services to
> >> return objects of different classes (which also extends X)! What do
> >> you
> >> think?!
> >>
> >> -- fatemeh
> >>
> >> Arul Dhesiaseelan wrote:
> >>> Basically, you override base interface method in
> >>> ChildServiceInterface.
> >>> So, this should work by all means.
> >>>
> >>> I know for sure this works standalone CXF. I haven't tested in a
> >>> servlet
> >>> container.
> >>>
> >>> Here is my standalone test, in case if you are interested.
> >>>
> >>> public interface ParentServiceInterface {
> >>>  public String[] getXList();
> >>> }
> >>>
> >>> @WebService
> >>> public interface ChildServiceInterface extends
> >>> ParentServiceInterface{
> >>>       @WebMethod
> >>>       public String[] getXList();
> >>> }
> >>>
> >>> public class ChildServiceImpl implements ChildServiceInterface {
> >>>       public String[] getXList(){
> >>>            return new String[] {"child"};
> >>>       }
> >>> }
> >>>
> >>> public class Server {
> >>>  public static void main(String args[]) {
> >>>    System.out.println("Starting Server");
> >>>    ChildServiceImpl implementor = new ChildServiceImpl();
> >>>    String address = "http://localhost:9000/child";
> >>>    Endpoint.publish(address, implementor);
> >>>  }
> >>> }
> >>>
> >>> public class Client {
> >>>  public static void main(String args[]) {
> >>>    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
> >>>    factory.setServiceClass(ChildServiceInterface.class);
> >>>    factory.setAddress("http://localhost:9000/child");
> >>>
> >>>    ChildServiceInterface client =
> >>> (ChildServiceInterface)factory.create();
> >>>    System.out.println("Invoke getXList()....");
> >>>    System.out.println(client.getXList()[0]);
> >>>    System.exit(0);
> >>>
> >>>  }
> >>> }
> >>>
> >>> HTH.
> >>>
> >>> Cheers,
> >>> Arul
> >>>
> >>> Fatemeh Chitforoush wrote:
> >>>> Hi,
> >>>>
> >>>> Does CXF support inheritance in service interfaces?
> >>>> I want to have a common interface for a number of services, so I
> >>>> have a
> >>>> parent interface, and all my service interfaces extend this parent
> >>>> interface. When i try to fire up tomcat, this exception is thrown:
> >>>> An opration  "an operation with name [] already exists in this
> >>>> service.
> >>>> Does CXF support what I want?
> >>>>
> >>>> Sample code:
> >>>> public interface ParentServiceInterface {
> >>>>      public X[] getXList();
> >>>> }
> >>>>
> >>>> public interface ChildServiceInterface extends
> >>>> ParentServiceInterface{
> >>>>       @WebMethod
> >>>>       public X[] getXList();
> >>>> }
> >>>>
> >>>> public class ChildServiceImpl implements ChildServiceInterface {
> >>>>       public XChild[] getXList(){
> >>>>            .......
> >>>>       }
> >>>> }
> >>>>
> >>>> public class XChild extends X{
> >>>> ......
> >>>> }
> >>
> >> --
> >> View this message in context:
> >> http://www.nabble.com/Service-Interface-Extension-in-CXF-tp18708779p1872
> >>8166.html Sent from the cxf-user mailing list archive at Nabble.com.
> >
> > ---
> > Daniel Kulp
> > dkulp@apache.org
> > http://www.dankulp.com/blog



-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog

Re: Service Interface Extension in CXF

Posted by Fatemeh Chitforoush <ch...@gmail.com>.
I also put a 0-arg default constructor for XChild, as you said, but still
throws the same exception!
My code is exactly the same as Child-Parent example (I posted here!) :S It
seems that it should work!!! I am totally confused :S


Arul Dhesiaseelan wrote:
> 
> Make sure you have a 0-arg default constructor in place for XChild as 
> this is required for JAXB.
> 
> -Arul
> 
> Fatemeh Chitforoush wrote:
>> Thanx for your reply.
>>
>> I changed the implementation as you said:
>>
>> @WebService
>> @XmlSeeAlso({XChild.class})
>> public interface ChildServiceInterface extends  ParentServiceInterface{
>>      @WebMethod
>>      public String[] getXList();
>> }
>>
>> and now, there is no exception during tomcat start-up, but as I call the
>> service from client, this exception is thrown by JAXB:
>> javax.xml.bind.JAXBException : XChild is not known to this context !!!!
>>
>> Don't you know the solution?!
>>
>> -- fatemeh
>>
>>
>> dkulp wrote:
>>   
>>> This is doable, but requires a little bit more setup....
>>>
>>> First, the method signature must stay the same as what's in the  
>>> interface.   It needs to stay:
>>> public X[] getXList();
>>> We only invoke on the actual method object defined from the interface.
>>>
>>> The key issue is getting the XChild classes available to JAXB.  The  
>>> EASIEST way to do that is to add an annotation to the Interface:
>>> @XmlSeeAlso({XChild.class})
>>> (might be able to add it to the impl instead, not really sure)
>>>
>>> Dan
>>>
>>>
>>>
>>> On Jul 30, 2008, at 4:15 AM, Fatemeh Chitforoush wrote:
>>>
>>>     
>>>> Hi,
>>>>
>>>> Thanx for your reply :)
>>>> BTW, I'm using Spring too, and I think maybe the problem relates to  
>>>> the
>>>> service implementor, which returns XChild instead of X! In fact,  
>>>> this part
>>>> is not covered in your sample test :S Actually i need inherited  
>>>> services to
>>>> return objects of different classes (which also extends X)! What do  
>>>> you
>>>> think?!
>>>>
>>>> -- fatemeh
>>>>
>>>>
>>>> Arul Dhesiaseelan wrote:
>>>>       
>>>>> Basically, you override base interface method in  
>>>>> ChildServiceInterface.
>>>>> So, this should work by all means.
>>>>>
>>>>> I know for sure this works standalone CXF. I haven't tested in a  
>>>>> servlet
>>>>> container.
>>>>>
>>>>> Here is my standalone test, in case if you are interested.
>>>>>
>>>>> public interface ParentServiceInterface {
>>>>>  public String[] getXList();
>>>>> }
>>>>>
>>>>> @WebService
>>>>> public interface ChildServiceInterface extends  
>>>>> ParentServiceInterface{
>>>>>       @WebMethod
>>>>>       public String[] getXList();
>>>>> }
>>>>>
>>>>> public class ChildServiceImpl implements ChildServiceInterface {
>>>>>       public String[] getXList(){
>>>>>            return new String[] {"child"};
>>>>>       }
>>>>> }
>>>>>
>>>>> public class Server {
>>>>>  public static void main(String args[]) {
>>>>>    System.out.println("Starting Server");
>>>>>    ChildServiceImpl implementor = new ChildServiceImpl();
>>>>>    String address = "http://localhost:9000/child";
>>>>>    Endpoint.publish(address, implementor);
>>>>>  }
>>>>> }
>>>>>
>>>>> public class Client {
>>>>>  public static void main(String args[]) {
>>>>>    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
>>>>>    factory.setServiceClass(ChildServiceInterface.class);
>>>>>    factory.setAddress("http://localhost:9000/child");
>>>>>
>>>>>    ChildServiceInterface client =
>>>>> (ChildServiceInterface)factory.create();
>>>>>    System.out.println("Invoke getXList()....");
>>>>>    System.out.println(client.getXList()[0]);
>>>>>    System.exit(0);
>>>>>
>>>>>  }
>>>>> }
>>>>>
>>>>> HTH.
>>>>>
>>>>> Cheers,
>>>>> Arul
>>>>>
>>>>> Fatemeh Chitforoush wrote:
>>>>>         
>>>>>> Hi,
>>>>>>
>>>>>> Does CXF support inheritance in service interfaces?
>>>>>> I want to have a common interface for a number of services, so I  
>>>>>> have a
>>>>>> parent interface, and all my service interfaces extend this parent
>>>>>> interface. When i try to fire up tomcat, this exception is thrown:
>>>>>> An opration  "an operation with name [] already exists in this  
>>>>>> service.
>>>>>> Does CXF support what I want?
>>>>>>
>>>>>> Sample code:
>>>>>> public interface ParentServiceInterface {
>>>>>>      public X[] getXList();
>>>>>> }
>>>>>>
>>>>>> public interface ChildServiceInterface extends  
>>>>>> ParentServiceInterface{
>>>>>>       @WebMethod
>>>>>>       public X[] getXList();
>>>>>> }
>>>>>>
>>>>>> public class ChildServiceImpl implements ChildServiceInterface {
>>>>>>       public XChild[] getXList(){
>>>>>>            .......
>>>>>>       }
>>>>>> }
>>>>>>
>>>>>> public class XChild extends X{
>>>>>> ......
>>>>>> }
>>>>>>
>>>>>>
>>>>>>           
>>>>>
>>>>>
>>>>>         
>>>> -- 
>>>> View this message in context:
>>>> http://www.nabble.com/Service-Interface-Extension-in-CXF-tp18708779p18728166.html
>>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>>
>>>>       
>>> ---
>>> Daniel Kulp
>>> dkulp@apache.org
>>> http://www.dankulp.com/blog
>>>
>>>
>>>
>>>
>>>
>>>
>>>     
>>
>>   
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Service-Interface-Extension-in-CXF-tp18708779p18825689.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: Service Interface Extension in CXF

Posted by Arul Dhesiaseelan <ar...@fluxcorp.com>.
Make sure you have a 0-arg default constructor in place for XChild as 
this is required for JAXB.

-Arul

Fatemeh Chitforoush wrote:
> Thanx for your reply.
>
> I changed the implementation as you said:
>
> @WebService
> @XmlSeeAlso({XChild.class})
> public interface ChildServiceInterface extends  ParentServiceInterface{
>      @WebMethod
>      public String[] getXList();
> }
>
> and now, there is no exception during tomcat start-up, but as I call the
> service from client, this exception is thrown by JAXB:
> javax.xml.bind.JAXBException : XChild is not known to this context !!!!
>
> Don't you know the solution?!
>
> -- fatemeh
>
>
> dkulp wrote:
>   
>> This is doable, but requires a little bit more setup....
>>
>> First, the method signature must stay the same as what's in the  
>> interface.   It needs to stay:
>> public X[] getXList();
>> We only invoke on the actual method object defined from the interface.
>>
>> The key issue is getting the XChild classes available to JAXB.  The  
>> EASIEST way to do that is to add an annotation to the Interface:
>> @XmlSeeAlso({XChild.class})
>> (might be able to add it to the impl instead, not really sure)
>>
>> Dan
>>
>>
>>
>> On Jul 30, 2008, at 4:15 AM, Fatemeh Chitforoush wrote:
>>
>>     
>>> Hi,
>>>
>>> Thanx for your reply :)
>>> BTW, I'm using Spring too, and I think maybe the problem relates to  
>>> the
>>> service implementor, which returns XChild instead of X! In fact,  
>>> this part
>>> is not covered in your sample test :S Actually i need inherited  
>>> services to
>>> return objects of different classes (which also extends X)! What do  
>>> you
>>> think?!
>>>
>>> -- fatemeh
>>>
>>>
>>> Arul Dhesiaseelan wrote:
>>>       
>>>> Basically, you override base interface method in  
>>>> ChildServiceInterface.
>>>> So, this should work by all means.
>>>>
>>>> I know for sure this works standalone CXF. I haven't tested in a  
>>>> servlet
>>>> container.
>>>>
>>>> Here is my standalone test, in case if you are interested.
>>>>
>>>> public interface ParentServiceInterface {
>>>>  public String[] getXList();
>>>> }
>>>>
>>>> @WebService
>>>> public interface ChildServiceInterface extends  
>>>> ParentServiceInterface{
>>>>       @WebMethod
>>>>       public String[] getXList();
>>>> }
>>>>
>>>> public class ChildServiceImpl implements ChildServiceInterface {
>>>>       public String[] getXList(){
>>>>            return new String[] {"child"};
>>>>       }
>>>> }
>>>>
>>>> public class Server {
>>>>  public static void main(String args[]) {
>>>>    System.out.println("Starting Server");
>>>>    ChildServiceImpl implementor = new ChildServiceImpl();
>>>>    String address = "http://localhost:9000/child";
>>>>    Endpoint.publish(address, implementor);
>>>>  }
>>>> }
>>>>
>>>> public class Client {
>>>>  public static void main(String args[]) {
>>>>    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
>>>>    factory.setServiceClass(ChildServiceInterface.class);
>>>>    factory.setAddress("http://localhost:9000/child");
>>>>
>>>>    ChildServiceInterface client =
>>>> (ChildServiceInterface)factory.create();
>>>>    System.out.println("Invoke getXList()....");
>>>>    System.out.println(client.getXList()[0]);
>>>>    System.exit(0);
>>>>
>>>>  }
>>>> }
>>>>
>>>> HTH.
>>>>
>>>> Cheers,
>>>> Arul
>>>>
>>>> Fatemeh Chitforoush wrote:
>>>>         
>>>>> Hi,
>>>>>
>>>>> Does CXF support inheritance in service interfaces?
>>>>> I want to have a common interface for a number of services, so I  
>>>>> have a
>>>>> parent interface, and all my service interfaces extend this parent
>>>>> interface. When i try to fire up tomcat, this exception is thrown:
>>>>> An opration  "an operation with name [] already exists in this  
>>>>> service.
>>>>> Does CXF support what I want?
>>>>>
>>>>> Sample code:
>>>>> public interface ParentServiceInterface {
>>>>>      public X[] getXList();
>>>>> }
>>>>>
>>>>> public interface ChildServiceInterface extends  
>>>>> ParentServiceInterface{
>>>>>       @WebMethod
>>>>>       public X[] getXList();
>>>>> }
>>>>>
>>>>> public class ChildServiceImpl implements ChildServiceInterface {
>>>>>       public XChild[] getXList(){
>>>>>            .......
>>>>>       }
>>>>> }
>>>>>
>>>>> public class XChild extends X{
>>>>> ......
>>>>> }
>>>>>
>>>>>
>>>>>           
>>>>
>>>>
>>>>         
>>> -- 
>>> View this message in context:
>>> http://www.nabble.com/Service-Interface-Extension-in-CXF-tp18708779p18728166.html
>>> Sent from the cxf-user mailing list archive at Nabble.com.
>>>
>>>       
>> ---
>> Daniel Kulp
>> dkulp@apache.org
>> http://www.dankulp.com/blog
>>
>>
>>
>>
>>
>>
>>     
>
>