2 Replies Latest reply on Jul 21, 2009 4:09 AM by pio1k

    Inheritance problem

    pio1k

      Hello.

      I have a problem with class inheritance in web services. I want to make a web service with one method to add objects of classes (B, C and other in the future) which inheritated from my basic class (A). My source code:

      Server side:
      1) TestService.java

      @WebService(serviceName = "TestService")
      @Stateless
      @XmlSeeAlso({B.class, C.class})
      public class TestService {
       @EJB
       TestMgmtLocal tl = null;
      
       @WebMethod(operationName = "testAddA")
       public @WebResult(name = "A")
       A testAddA(@WebParam(name = "testA") A testA) {
       return tl.testAddA(testA);
       }
      }


      2) TestMgmtLocal.java
      @Local
      public interface TestMgmtLocal extends TestMgmtRemote {
      
      }


      3) TestMgmtRemote.java
      @Remote
      public interface TestMgmtRemote {
       A testAddA(A testA);
      }


      4) TestMgmt.java
      @Stateless
      public class TestMgmt implements TestMgmtLocal {
       @Resource
       private SessionContext ctx = null;
      
       public A testAddA(A testA) {
       if (testA instanceof A) {
       System.out.println("class A");
       }
      
       if (testA instanceof B) {
       System.out.println("class B");
       }
      
       if (testA instanceof C) {
       System.out.println("class C");
       }
      
       return testA;
       }
      }


      5) A.java
      public class A implements Serializable {
      
       private static final long serialVersionUID = 110181269433550832L;
      
       private int a = -1;
      
       public int getA() {
       return a;
       }
      
       public void setA(int a) {
       this.a = a;
       }
      }


      6) B.java
      public class B extends A implements Serializable {
      
       private static final long serialVersionUID = 6921792702940813727L;
      
       private int b = -1;
      
       public int getB() {
       return b;
       }
      
       public void setB(int b) {
       this.b = b;
       }
      }


      7) C.java
      public class C extends A implements Serializable {
      
       private static final long serialVersionUID = 7823155353151239133L;
      
       private int c = -1;
      
       public int getC() {
       return c;
       }
      
       public void setC(int c) {
       this.c = c;
       }
      }


      Client side:
      1) TestClient.java
      public class TestClient {
      
       public static void main(String[] args) {
       TestServiceProxy proxy = new TestServiceProxy();
       TestService_PortType port = proxy.getTestService_PortType();
       try {
       C c = new C();
       c.setA(2);
       c.setC(3);
       port.testAddA(c);
       } catch(RemoteException e) {
       System.out.println(e);
       }
       }
      }


      I found this page:
      http://blog.vinodsingh.com/2008/09/anytype-object-over-webservice-and.html
      but it doesn't work in my web service. In testAddA method I always get an object of A class (when I send from client object of B or C class). I've also tried to add @XmlSeeAlso annotation to A class but it doesn't help. Maybe I did something wrong? Any ideas? Any other solutions of this problem?

      I'm using:
      1) JBoss 4.2.3GA (I tired also on JBoss 5.1.GA)
      2) Java 1.5 update 15