# CXF XML Binding



## Guest (6. Okt 2008)

Hi,
folgende Sache.

Hab einen kleinen WebService mit einer Methode getPojo die mir die Klasse Pojo zurückliefert. Bei der Klasse Pojo handelt es sich, wie der Name schon vermuten lässt, um eine einfache Java-Klasse, mit zwei String Attributen data1 und data2, getter und setter und einem Default-Konstruktor.

So schaut das Mapping im wsdl aus:

```
<xs:complexType name="pojo">
  <xs:sequence>
  <xs:element minOccurs="0" name="data1" type="xs:string" /> 
  <xs:element minOccurs="0" name="data2" type="xs:string" /> 
  </xs:sequence>
</xs:complexType>
```

Es werden also die Namen der Variablen für die Tags vergeben, genau das würde ich gerne ändern. Probiert hab ich die @XmlElement-Annotation mit name = "Stringdata1" auf die Methode getData1, jedoch bewirkt diese nichts. Kann mir da jemand bitte nen Tipp geben was zusätzlich oder gar anders zu machen ist. 

Danke


----------



## tinker (6. Okt 2008)

Add:
CXF Version 2.1

Import für XmlElement: org.apache.cxf.aegis.type.java5.XmlElement;

(Hab vorhin vergessen mich einzuloggen)


----------



## foobar (6. Okt 2008)

Wenn du das Typemapping ändern willst, kannste auch direkt JAXB anstatt Aegis nutzen.


----------



## tinker (6. Okt 2008)

Funktioniert, danke!

Hab es jetzt auch bei meiner komplexeren Struktur umgesetzt, wo unter anderem auch HashTables vorhanden sind. Wenn ich nun ein solches Element mit @XmlElement auf einen anderen Namen mappe, bekomm ich als Anwort vom Service nur einen leeren Tag. Sobald ich die Annotation wieder rausnehme, funktionierts wieder. Kann mir dazu auch jemand was sagen?

EDIT: Habs schon herausgefunden, funktioniert mit @XmlElementWrapper


----------



## tinker (8. Okt 2008)

So, mit den Annotations funktioniert das ganze schon gut. 

Nun würd ich das ganze aber gerne über eine Konfigurations-Datei realisieren um in den Klassen auf Annotationen zu verzichten.

Wie schaut es da mit JAXB aus? Es geht dabei nur um einfache Mappings, bisher wurden hauptsächlich die Annotationen @XmlType, @XmlElement, @XmlElementWrapper und @XmlElements verwendet, also nichts aufregendes.

Wenn ich mir die Dokumentation zu JAXB und Konfig.-Files anschaue, muss ich sagen das ich irgendwie nicht durchblicke. Könnte mir jemand ne kurze Einführung geben (kann ja nicht so kompliziert sein) oder gute links dazu posten!?

Danke.


----------



## foobar (8. Okt 2008)

JAXB verwendet normalerweise Annos. Das Aegis Databinding kann man zuästzlich noch über Xml konfigurieren finde ich persönlich aber viel anfälliger und aufwändiger zu pflegen.
Es gibt ja noch einige andere Databindings. Wirf mal einen Blick in die CXFDoku.


----------



## tinker (8. Okt 2008)

Ok, danke für deine Antwort.
Hab mir jetzt mal folgendes angeschaut: http://cwiki.apache.org/CXF20DOC/aegis-21.html

Hab eine Klasse ConfTest mit den Parametern data1 und data2 im Package xy. Jetzt hab ich ein xml-File ConfTest.aegis.xml im selben Package erstellt, mit dem Inhalt:
	
	
	
	





```
<mappings>
  <mapping name="">
    <property name="data1" mappedName="Vorname" />
  </mapping>
</mappings>
```

Das mapping funktioniert allerdings nicht.

Was mich etwas verwirrt in der cxf-Doku vom oben geposteten link:





> if Eels.class is sitting in a JAR file or a directory, Eels.aegis.xml can be sitting right next to it



Also soll sich das xml-File jetzt im selben Ordner wie das .class File befinden? Wie soll das gehen? Denn nach jeder Codeänderung erstell ich mit mvn clean package ein .war-File das ich auf den Tomcat gebe. Und dabei wird der alte Ordner mit den .class-Files natürlich gelöscht und ein neuer erzeugt.

Also wo jetzt hin mit dem xml-File?

Danke!


----------



## foobar (8. Okt 2008)

Ja, die configFiles müssen im selben Package (Ordner) wie die Klasse liegen und den selben Namen+aegis.xml tragen.

Du mußt dann mit maven dafür sorgen, daß nach dem kompilieren, die configfiles mit ins war gepackt werden.


----------



## tinker (9. Okt 2008)

Danke für den Tipp. Hab es jetzt geschaft, das das conf-File nach dem kompilieren im selben Odner wie die Klasse liegt (hab unter src/main/resources ein Package mit dem selben Namen angelegt und dort das xml-File hinein)

Jedoch funktioniert das mapping trotzdem noch nicht. Die Datei ConfTest.aegis.xml sieht wie folgt aus:
	
	
	
	





```
<mappings xmlns:np="<namespace>">
  <mapping name="np:ConfTest">
    <property name="data1" mappedName="Feathers"/>
    <property name="data2" mappedName="Bones"/>
  </mapping>
</mappings>
```

Laut Doku sollte es ja funktionieren wenn das xml im selben Ordner wie die class Datei liegt. Und das xml-File sollte soweit auch passen.

Oder muss ansonsten noch was konfiguriert werden?


----------



## foobar (9. Okt 2008)

Nein, sonst brauchst du nichts.

Genau deswegen finde ich Annos viel praktischer ;-)


----------



## tinker (9. Okt 2008)

Ich auch, vor allem weils mit annos ja funktioniert...

ABER, folgende Situation:

Ich hab ein Webservice mit diversen Methoden die mit Beans arbeiten. Diese Beans werden atm wie gesagt mit annotationen gemappt. Weiters liefern sie noch hartkodierten Code als Ausgabe. Das soll sich jetzt ändern und die Daten sollen aus einer DB kommen. Dazu wird der Server in zwei Bereiche aufgeteilt: 1. WebService und 2. DataAccess.

Auf beiden Seiten arbeite ich mit Objekten, über ein Interface. Auf WebService seite, wenn zb getPojo aufgerufen wird, ruf ich dann nur noch DataAccessInterface.getPojo() auf und bekomm ein Pojo-Objekt das ich dann zurückgebe.

Zur Zeit existiert die Klasse Pojo nur auf WebService-Seite, und wird, wie gesagt, mit annos gemappt. Auf DataAccess Seite muss es dann natürlich die selbe Klasse geben. Nur die Klasse Pojo des WS verwenden, halt ich für ne unschöne Lösung, da diese ja die Annos enthält die mir auf DataAccess Seite komplett egal sind.

Darum sollen die Klassen ganz einfache Beans sein, ohne Annos. Diese werden dann zwischen den Layern ausgetauscht und erst auf WS-Seite wird mittels Config-File das Mapping hinzugefügt.

Desshalb würd ichs gerne mit config-Files machen. Oder hat vielelciht jemand ne bessere Idee für diese Situation?

thx


----------



## tinker (15. Okt 2008)

So, funktioniert nun. Für die Zukunft:

Bin bei meiner Suche auf folgenden mail-Eintrag gestoßen: click

Hab den code also in mein Service-xml aufgenommen.

Und nun funktioniert auch das mapping!
Wie gesagt, dazu einfach die aegis.xml Files ins selbe Package (funktioniert auch Projekt-übergreifend)


----------

