# WSDL2JAVA erzeugt Arrays - anstatt Collections ???



## pocketom (14. Jul 2009)

Hi,

simples Problem. Generiere ich mit JAXB Klassen aus einem XSD Schema dann ist alles perfekt, aus einem 
	
	
	
	





```
<xsd:element name="myName" type="myType" maxoccurs:unbounded">
```
 wird 
	
	
	
	





```
protected List<myType> myname;
```

Anschliessend habe ich mein XSD File in einem WSDL File importiert. Benutze ich zur Codegenerierung jetzt das WSDL2JAVA Tool von Axis2, dann kommt stattdessen ein hässliches 
	
	
	
	





```
protected myType[] myName;[/Java] heraus...

Wie kann ich das verhindern? Er soll mir gefälligst anständige Collections generieren!
```


----------



## Noctarius (14. Jul 2009)

Du mischt 2 verschiedene Techniken und diese haben Inkompatibilitäten.

Muss es Axis2 sein oder würde dir z.B. auch Apache CXF (das benutzt auch JAXB) weiterhelfen?


----------



## pocketom (14. Jul 2009)

Es ist unser erstes Axis Projekt, somit muss es nicht zwingend sein. Wir sind wohl einfach nur zuerst auf Axis gestossen. Die entscheidende Frage dabei ist ob CXF auch unter Delphi verwendet werden kann? Bzw. ob es für Delphi ein Tool gibt um Client-Code automatisch aus einer Definitionsdatei (so wie auch mit WSDL) zu erzeugen? Wir haben leider noch viele Altlasten in dem Bereich und müssen auch ältere Delphi Projekte an die Servicewelt anbinden.

[EDIT]
Grade nachgelesen, CFX unterstützt ja auch WSDL. Heisst das ein bestehender Client dessen Code aus einer WSDL Definition generiert wurde würde von einem Wechsel auf CXF garnichts mitbekommen (ausser einer anderen Service-URL)?

Dort gibts ja auch ein WSDLtoJava Tool, das hat aber hoffentlich nichts ausser dem Namen mit dem Axis2 WSDL2Java zu tun oder?


----------



## musiKk (14. Jul 2009)

Kannst ja mal wsimport ausprobieren, das ist ab Java6 im JDK mitgeliefert (bei älteren Java-Installationen jaxws manuell von Sun beziehen). Ich bin mir nicht mehr sicher, ob WSDL2JAVA nicht nur ein Wrapper dafür ist, aber ich glaube nicht. Jedenfalls habe ich immer [c]List[/c]en in meinen Klassen erhalten.


----------



## Noctarius (15. Jul 2009)

pocketom hat gesagt.:


> Grade nachgelesen, CFX unterstützt ja auch WSDL. Heisst das ein bestehender Client dessen Code aus einer WSDL Definition generiert wurde würde von einem Wechsel auf CXF garnichts mitbekommen (ausser einer anderen Service-URL)?



Selbst den Endpoint des Services bräuchtest du nicht mal ändern, außer: Ihr wollt den Alten natürlich weiterhin benutzen.

In Verbindung mit Spring WS (bzw Spring allgemein) kannst du dir sogar noch viel Arbeit sparen und das WSDL automatisch zur Laufzeit generieren lassen.


----------



## pocketom (16. Jul 2009)

Wie meinst du zur Laufzeit generieren? In Axis hatte man ja unter Server/Dienstname?wsdl auch immer eine "Live" Version des aktuellen WSDL, diese URL haben meine Client benutzt um Ihren Code zu updaten.


----------



## Noctarius (16. Jul 2009)

Genau das meine ich


----------



## pocketom (30. Jul 2009)

So, mit CXF und dessen WSDL2JAVA funktionierts eigentlich ganz gut. Vorrausgesetzt man nimmt einen ComlexType der eine Sequence mit unbounded Elementen beinhaltet. Das gibt schöne Listen im generierten Code.

Nimmt man jedoch einen Simpletype, z.B. um eine Liste von Strings zu definieren:

[XML]
<xsd:simpleType name="stringList">
	<xsd:list itemType="xsd:string"/>
</xsd:simpleType>
[/XML]

Kommt das dabei raus:


```
public java.lang.String[] sendMyTestRequest() {
...
...
...
}
```

_<PERFECTION MODE="ON"/>_
Ist jetzt wiklich nur noch die Frage wie man als Rückgabeparameter einer Funktion ein List<String> definiert...? Complex Type ist hier nicht so elegant, denn dann habe ich ja wieder eine neue Klasse erzeugt...

Hat dafür noch jemand nen Ansatz parat? 
_<PERFECTION MODE="OFF"/>_

:-D


----------

