Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Webservice in Eclipse entwickeln

(1/3) > >>

Mark³:
Ich möchte einen kleinen Webservice in Eclipse bauen, der mir Personendaten in einem Drittsystem anlegt.
In der Eclipse-Hilfe hab ich gelesen, dass man das am besten top-bottom macht und erst das WSDL anlegt. Dabei stürzte mir Eclipse 3.2 mehrmals ab, irgendwann hatte ich dann ein WSDL fertig und hab mir daraus ein Java-Rumpf generieren lassen. Das Binding hat meine Typen immer als Target 'www.example.org/Person' gemacht. Was soll hier eigentlich rein? Muss das eine real zugängliche URL sein wo das Schema abgelegt wird? Das wäre ja blöd für Testserver und Produktivserver...Naja jedenfalls ahtte ich diverse Verständnisprobleme und will es nun doch lieber bottom-up machen weil das für Anfänger einfacher sein soll (ganz einfach wäre es natürlich in Notes 7 aber das scheidet hier aus)
Nun brauche ich also eine JavaBean aus der ich mir den Webservice generieren lasse. Aber wie soll die Bean aussehen?
Mein Webservice soll Personendaten empfangen und liefern können und Methoden wie 'Neue Person' und 'Person anzeigen' haben. Nehme ich nun document oder RPC/literal für den WebService (WS) ? Und wie übergebe ich dann die Variablen? Hat meine PersonBean die Membervariablen Name, Vorname, Telefon etc oder nehme ich ein Interface dafür oder getter und setter?

flaite:

--- Zitat von: Mark³ am 04.04.07 - 16:01:54 ---Ich möchte einen kleinen Webservice in Eclipse bauen, der mir Personendaten in einem Drittsystem anlegt.
In der Eclipse-Hilfe hab ich gelesen, dass man das am besten top-bottom macht und erst das WSDL anlegt.

--- Ende Zitat ---
Theoretisch richtig. Ich find aber WSDLs wirklich nicht einfach zu schreiben.

--- Zitat ---Dabei stürzte mir Eclipse 3.2 mehrmals ab, irgendwann hatte ich dann ein WSDL fertig und hab mir daraus ein Java-Rumpf generieren lassen. Das Binding hat meine Typen immer als Target 'www.example.org/Person' gemacht. Was soll hier eigentlich rein? Muss das eine real zugängliche URL sein wo das Schema abgelegt wird?

--- Ende Zitat ---
Zu faul zum nachschauen. Afaik erzeugt man das Schema der Businessdaten implizit im WSDL selbst. Kann aber morgen mal nachschlagen, bei WSDLs, auf die ich zugreife.



--- Zitat ---...Naja jedenfalls ahtte ich diverse Verständnisprobleme und

--- Ende Zitat ---
...falls nicht müsstest du dir glaub ich ernsthaft Gedanken um deine geistige Gesundheit machen. Es ist sehr komplex. Gibt eine Menge Tools um WSDLs zu lesen und wohl auch zu schreiben. Z.B. kannst du in Altova XML Spy Enterprise einfach eine WSDL übergeben und der erzeugt dann eine Beispiel-SOAP Nachricht für diese WSDL. Ohne das Teil wäre ich wahnsinnig geworden. Ich programmiere einen Webservice Client auf Tomcat gegen SAP Application Server. Auf der SAP Seite erzeugen die WSDLs automatisch aus RFCs.

--- Zitat ---will es nun doch lieber bottom-up machen weil das für Anfänger einfacher sein soll (ganz einfach wäre es natürlich in Notes 7 aber das scheidet hier aus)

--- Ende Zitat ---
Ohne Tools präferiere ich POX. Plain Old XML Webservices. Du schickst einfach eine XML Nachricht mit jakarta HTTP Client an einen Server, der parst sie, verarbeitet die Daten, erzeugt ein XML und schickt es zurück.
Ich glaub die Eclipse Sachen basieren noch auf axis1. Axis2 ist echt besser. Oder Xfire.
Hab festgestellt: Was man wirklich braucht, ist ein Binding Framework wie JAXB. Auch mit Pox. Oder ein selbstgeschriebenes. Du willst nicht wirklich in deinen Business-Objekten xml parsen. Dann sind es nämlich keine Business Objekte mehr sondern Chaos.

--- Zitat ---Nun brauche ich also eine JavaBean aus der ich mir den Webservice generieren lasse. Aber wie soll die Bean aussehen?

--- Ende Zitat ---
Konstruktor ohne Parameter und ein paar private Felder, die mit public get und set Methoden gefüllt und ausgelesen werden. Das ist alles.

--- Zitat ---Mein Webservice soll Personendaten empfangen und liefern können und Methoden wie 'Neue Person' und 'Person anzeigen' haben. Nehme ich nun document oder RPC/literal für den WebService (WS) ?

--- Ende Zitat ---
Nimm einfach eins von den beiden. So richtig hab ich den Unterschied selbst noch nicht kapiert. Wichtig ist, nicht "encoding' zu nehmen.

--- Zitat ---Und wie übergebe ich dann die Variablen? Hat meine PersonBean die Membervariablen Name, Vorname, Telefon etc oder nehme ich ein Interface dafür oder getter und setter?

--- Ende Zitat ---
Da kümmert sich das Binding Framework drum. Ansonsten einfach ein JavaBean wie oben beschrieben.

Wichtig für meine Praxis ist, WSDL einigermassen lesen zu können. Das ist in verschiedenen Büchern beschrieben. Die SOAP Nachrichten selbst sind einfach nur XML. Ich greif z.B. auf document-literal Daten von einem SAP Application Server mit jakarta.commons.HTTP, SAX und einem selbst geschriebenen Binding Framework drauf zu. Geht auch. Ist stabil und hat seine Gründe.

Leute, die WSDL von Hand schreiben, gehen sicher von funktionierenden Beispiel-WSDLs aus. Sonst ist das echt zu komplex, ausser man hat das schon ein paar mal gemacht.

Letztlich gehts ja nur darum Daten in xml zu packen, die an einen Server zu schicken und Daten in xml zurück zu erhalten.


Gruß Axel

Mark³:
danke, das hilft mir schon mal weiter. Ich möchte möglichst alles in Eclipse machen, da das so schon unübersichtlich genug ist. Aber da wird wohl Axis 1 genommen (muss ich mal nachschauen).
Ich werde das mal mit der JavaBean probieren und mir daraus in Eclipse den Webservice generieren lassen.

flaite:
Von der Baustelle und sozusagen mit dem Presslufthammer:
- Ich hab eine Kette einer erstaunlichen Menge an Überstunden hinter mir.
- SOAP/WSDL sind als Spezifikation leider echt extrem komplex.


- Die Komplexität stört nicht sooo viel, wenn man da einmal praktisch durchgegangen ist (wie gesagt anstrengend).
- Es gibt gute Tools. Du brauchst aber ein gewisses Gespür für die Architektur. Das heisst AFAIK nicht, die SOAP Spec in allen Einzelheiten zu kennen.

Worum gehts?
Systemintegration. Daten zwischen 2 Systemen austauschen in xml.

Was ist die Alternative?
Traditionelle Remote Interfaces für Systemintegration tauschten traditionell Daten immer als Binary aus (CORBA, ODBC/JDBC btw. irgendwie auch oder übrigens auch Remote Function Calls mit einem eigenen Protokoll -> Notes). Binary ist natürlich schneller. Aber heute kann man für viele Fälle den Geschwindigkeitsverlust durch XML-Encoding/Decoding, größere Nachrichten in Kauf nehmen.

Was sind nun die Vorteile gegenüber Binary?
Beide Seiten können die ausgetauschten Nachrichten sehen. Wenn der Mann auf der SAP Seite ein neues Feld in den Response einfügt, kann ich einfach eine SOAP Nachricht reinschicken und sehe dann, was da zusätzlich drin ist. Das ist mit Binary schwieriger.

Was bringt nun dieses WSDL?
Das Interface ist an einer Stelle gut dokumentiert. Z.B. kams vor, dass die auf der SAP Seite den Namen eines requestParameters umbenannt haben. Von ResponsableUser nach ResponsibleUser. Vielleicht haben die das in einer der zahlreichen Emails erwähnt. Vielleicht haben dies auch vergessen mir mitzuteilen. Egal. Sobald ich merke, dass mein Integrationstest nicht mehr funktioniert, kann ich ins WSDL schauen und das nicht mal mehr diskutieren. So solls sein.

Bewährt hat sich bei mir eine Reihe an Integrationstests, die die Webservices aufrufen und Daten zurückliefern. Ich habs mit JUnit gemacht. Sobald sich das stabilisiert, schreib ich da noch ein paar assertEqual() für Regressions-Tests. Aus Eclipse starte ich schon jetzt einfach die Testklasse, die alle SOAP Calls hintereinander ausführt. Zur Zeit wird da aber einfach die eingehenden und ausgehenden XML Nachrichten per System.out.println ausgegeben. Wichtig ist, dass die Nachrichten zumindest irgendwo gut formatiert angezeigt werden können. Die Felder wechseln sich einfach noch zu oft gewechselt, so dass ichs erst später per assertEquals absichere.

Wo muss man aufpassen?
Encoding der Nachrichten. Ich hatte eine Situation, in der ich dachte ich würd UTF-8 an den Server schicken, war aber ISO_8859_1. Der XML Parser des Webservices auf dem Server kann das dann nicht mehr parsen. Gibt eine "wrong character for encoding"-Response. Hab dann aber gesehen, dass eine meiner Libraries defaultmässig ISO_8859_1 verwendete und musste das umstellen. Neuere Libraries verwenden default-mässig eigentlich immer UTF-8.
Premature End of File Exception ist eine typische Fehlermeldung von ich glaub v.a. SAX Parsern. Kann allesmögliche heissen. Z.B. das der Testserver nicht läuft. Don't panic.

flaite:
XFire hat auch ein eclipse-plugin.
http://xfire.codehaus.org/
Auf der Seite sind Tutorials verlinkt. Das hab ich mal ausprobiert und funktioniert.
Das für mich sympathische an Java ist ja gerade, dass es nicht den "offiziellen" Weg für eine Technologie gibt. Das ist mehr ein Bazar, auf den konkurrierende Lösungen geschmissen werden.
Axis2 und Codehaus XFire sind Fortschritte gegenüber Axis1, die es dem Anwendungsentwickler v.a. auch einfacher machen. Du bekommst xml noch nicht mal zu Gesicht bei den XFire Anfängertutorials und das ist gut so.
Der Markt akzeptiert den Bazar-Charakter. In vielen Banken wird heute XFire präferiert. Den endgültigen Durchbruch für die Akzeptanz für diese Art des Bazars schafften wohl Spring und JBoss.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln