Problem with inheritance - JbossWS
fghj5678 Feb 11, 2009 10:46 AMI have problem to get inheritance in a WS to work.
I've tried a small example on these env:
Windows XP SP2
Jboss AS 4.2.2 GA , 4.2.3 (and also JBoss eap 4.3)
I'm trying to do a request to server with a parameter that contains a inherited class. Class testEnv contains class testAAA, and class testBBB inherits testAAA. So when I put testBBB in testEnv and sends it to the WS I'm supposed to get testBBB from testEnv on the server - but I only get a testAAA!
Classes used in my example:
@WebService
public interface TestWS {
public String test(TestEnv testEnv);
}
@Stateless
@WebService(name = "TestWSService", serviceName = "TestWSService")
@Remote(TestWS.class)
public class TestWSImpl implements TestWS {
public String test(TestEnv testEnv) {
if (testEnv.getTestAAA() instanceof TestAAA) {
return "WRONG, should not end up here";
} else if (testEnv.getTestAAA() instanceof TestBBB) {
return "CORRECT";
}
return "ERROR..";
}
public class TestEnv implements Serializable {
private static final long serialVersionUID = 1L;
TestAAA testAAA;
public TestAAA getTestAAA() {
return testAAA;
}
public void setTestAAA(TestAAA testAAA) {
this.testAAA = testAAA;
}
}
@XmlSeeAlso({TestBBB.class})
public class TestAAA implements Serializable {
private static final long serialVersionUID = 1L;
int a = 1;
}
public class TestBBB extends TestAAA implements Serializable {
private static final long serialVersionUID = 1L;
int b = 2;
}
Then I've tried both with SoupUI and a generated ws-client - but I always get a testAAA instead of testBBB. example from ws-client:
... TestWSService testWS = ts.getTestWSServicePort(); TestBBB testBBB = new TestBBB(); TestEnv testEnv = new TestEnv(); testEnv.setTestAAA(testBBB); String s = testWS.test(testEnv); ...
I also have logged the http soap request and it looks ok (with xsi:type for the inherited class), here is the parameter:
<testAAA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:testBBB"/>
This is from the generated wsdl: (which have a correct "extension base=..")
<xs:complexType name="test"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="tns:testEnv"/> </xs:sequence> </xs:complexType> <xs:complexType name="testEnv"> <xs:sequence> <xs:element minOccurs="0" name="testAAA" type="tns:testAAA"/> </xs:sequence> </xs:complexType> <xs:complexType name="testAAA"> <xs:sequence/> </xs:complexType> <xs:complexType name="testBBB"> <xs:complexContent> <xs:extension base="tns:testAAA"> <xs:sequence/> </xs:extension> </xs:complexContent> </xs:complexType>
Any help would be appreciated!
Mats.