# Können abstrakte Klassen über WSDL versendet werden?



## pocketom (30. Jul 2009)

Hi!

Habe meine WSDL Definition versucht ein bischen flexibler zu machen. Statt einer konkreten Klasse übergebe ich in der Nachricht die abstrakte Klasse _AbstractMyClass_:
[XML]
<wsdl:types>
    <xsd:complexType name="AbstractMyClass" abstract="true">        
	<xsd:sequence>
		<xsd:element name="mystring" type="xsd:string" minOccurs="0"/>		 
	</xsd:sequence>
    </xsd:complexType>
</wsdl:types>

<wsdl:message name="SendAbstractMyClassRequest">
     <wsdlart name="parameters" type="test:AbstractMyClass"/>
</wsdl:message>
[/XML]


Diese implementiere ich dann einfach selbst in Eclipse (Sinn: damit beim Ausführen von WSDL2JAVA immer nur alle abstrakten Klassen überschrieben werden und ich meine Logic in der Implementierung nicht verliere!):

```
com.mycompany.test;

public class MyClass extends AbstractMyClass{
	
	public MyClass () {
		super();
	}
}
```


Nun wurde noch eine Operation 'sendAbstractMyClassRequest' im WSDL definiert und dann der Code mit WSDL2Java generiert. Resultat im generierten ServiceInterface:

```
public String sendAbstractMyClassRequest(
        @WebParam(partName = "parameters", name = "parameters", targetNamespace = "http:mycompany.com/test")
        com.mycompany.test.AbstractMyClass parameters
    );
```

Die Servicemethode rufe ich dann natürlich mit meiner konkreten _MyClass_ im Client auf:

```
MyClass myclass = new MyClass();
service.sendAbstractMyClassRequest(myclass);
```


Das liefert mir dann leider folgende Exception:

```
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: Unable to create an instance of com.mycompany.test.MyClass
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:218)
	at $Proxy35.sendPushAbstractLabelRequest(Unknown Source)
```


Was kann ich hier tun? Ist diese Vorgehensweise überhaupt möglich?

Ich nutze CXF, Spring, Tomcat 6.x.


----------



## pocketom (31. Jul 2009)

So wie es aussieht kann man auch keine Klassen verschicken die abstrakte Klassen aggregieren? Ich frage mich wirklich wie ich nur meine abstrakten Basisklassen mit WSDL2Java generieren kann. Momentan besteht mein gesamtes XML Schema nur aus abstrakten Typen, sobald ich auch die Implementationen der ganzen abstrakten Klassen im Schema definiere überschreibt es mir bei jeder Codegenerierung alle Klassen. Ich möchte aber das nur die abstrakten Klassen neu generiert und überschrieben werden. Hat irgendwer hier einen Tip wie ich das machen kann?

In der CXF Doku findet sich folgendes:



> -nexclude schema-namespace [=java-packagename] 	 Ignore the specified WSDL schema namespace when generating code. This option may be specified multiple times. Also, optionally specifies the Java package name used by types described in the excluded namespace(s).



Ist das der richtige Ansatz?


----------



## pocketom (31. Jul 2009)

Also, -nexclude ist wohl verbuggt.

Habe folgendes in meine WSDL2JAVA config getan:
[xml]
<wsdlOption>								 
	<extraargs>
		<extraarg>-nexclude</extraarg>
		<extraarg>http:/mycomany.com/testnamespace</extraarg> 
	</extraargs>									
</wsdlOption>
[/xml]

Damit werden alle Klassen im Namespace 'http:/mycomany.com/testnamespace' bei der Codegeneration ignoriert. 
*Leider werden aber auch alle bereits existierenden Klassen komplett gelöscht (das gesamte Package wird gelöscht)!!!*

*AAARGGHHHHH*


----------



## pocketom (31. Jul 2009)

*Lösung gefunden:*

[xml]
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
...
...
...
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
>	

	<xsd:annotation>
        <xsd:appinfo>
           <jaxb:schemaBindings map="false"/>
        </xsd:appinfo>
    </xsd:annotation>
...
...
...
</xsd:schema>
[/xml]

Es wäre dennoch wesentlich einfacher und schöner wenn man das selbe mit der -nexclude Option direkt mit WSDL2Java lösen könnte (einfach nur einmal in die pom.xml einbauen)


----------

