Axis2 und wiederverwenden der Serverobjekte

  • Themenstarter Themenstarter Jizzi
  • Beginndatum Beginndatum
J

Jizzi

Gast
Hallo,

seit einiger Zeit bastle ich ein wenig an WebServices, baue mir dafür Java-Klassen (Datenklassen und jene mit den Funktionsaufrufen) und mache anschließend ein java2wsdl etc. Das funktioniert auch soweit alles super und habe auf diesem Wege schon viele WebServices erstellt (erfolgreich 😉 ).

Nun habe ich aber ein Problem:
Ich habe einen WebService names WSFlights, der das und das macht. Jetzt habe ich einen Service Weather, der etwas gänzlich anderes macht. ABER, um Service Weather ausführen zu können, brauche ich ein Datenobjekt aus dem Service Flights.
Was mache ich an solch einer Stelle?

Bsp:
Service Flights:
- public long countFlights(FlightQuery query);
- public Flights[] selectFlights(FlightQuery query);
- ....

"Flights" hat hier noch ein Unterobjekt namens "DateTime" (enthält bestimmte Datumskonventionen/Timestamps/letzter Bearbeiter etc.)


Service Weather
- public Weather getWeather(WeatherQuery query);
- public Wheater insertWeater(Weather insRecord);
- ...

"Weather" soll nun auch das Unterobjekt namens "DateTime" bekommen, ist aber ein gänzlich anderer Service.





Nun kann ich in Service Weather das "DateTime"-Objekt einfach noch einmal erzeugen via CopyPaste. Nur habe ich nachher auf dem Client das Objekt 2 oder mehrmals (einmal durch Flights und einmal durch Weather, jedoch sind beide auf dem Client unterschliedlich). Dies will ich eigentlich vermeiden, da so die Übersichtlichkeit stark leidet. Klar ist das nachher ein wenig Package gebunden und man würde die "DateTime"-Objekte anhand dessen auseinanderhalten können, aber unschön ist es dennoch.


Nun meine Frage, was kann man da machen? Kann man die Server-Objekte irgendwie so erzeugen, dass diese Klasse nur einmal existiert und auch auf dem Client nur einmal?



MfG

Jizzi
 
Nun meine Frage, was kann man da machen? Kann man die Server-Objekte irgendwie so erzeugen, dass diese Klasse nur einmal existiert und auch auf dem Client nur einmal?
Auf dem Server ist das kein Problem. Du hast zwei Service-Implementierungen, die auf das selbe Datenobjekt - in deinem Fall das DateTime - zurück greift. Im service.xml sind dann beide Webservices in einem aar.Archive zu definieren
Wenn du in einem Projekt auf beide Webservices (2 wsdl's) zugreifen willst, benötigst du auch zwei Clients, aus denen jeweils ein DateTime generiert werden. In diesem Fall lässt sich das nicht vermeiden. Aber du kannst mit dem Codegenerator (eclipse plugin) die Datenobjekte umbennen oder in einem anderen package legen.
 
[...]Wenn du in einem Projekt auf beide Webservices (2 wsdl's) zugreifen willst, benötigst du auch zwei Clients, aus denen jeweils ein DateTime generiert werden[...]

Bist Du Dir da sicher? Ich meine mich entsinnen zu können, dass ich mit Hilfe des wsdl2java Generators auch die entsprechenden Klassen "entpacken" (un-wrap) kann. Diese landen dann in die entsprechenden Pakete, wo sie vorher auch schon waren. Mit anderen Worten: Wenn ich zwei unterschiedliche wsdl-Dateien habe, aus denen ich meine Stubs erzeugen lasse, würden sich die überschneidenden Klassen gegenseitig überschreiben (was in diesem Fall wohl okay wäre).

Die dazu nötigen Schalter für den wsdl2java Aufruf müssten "-or -u" sein
 
Zuletzt bearbeitet:
Ja, das könnte funktionieren, wenn die beiden DateTime-Objekte den gleichen Namespace haben. Da das meistens nicht der Fall ist, würde ich aus den wsdl's jeweils ein Client-Stub in unterschiedlichen packages generieren. Ist auch weniger fehleranfällig.
 

Zurück
Oben