Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
webservice mit java erstellen. was brauch ich alles dazu?
moin zusammen,
möchte bzw. muss einen webservice mit java erstellen und irgendwie krieg ich den ganzen spaß nicht ans laufen.
was brauche ich alles für mein unterfangen?
ich entwickle mit OS Suse und
IDE Eclipse
ein bischen kenn ich mich mit webservice aus. aber halt nur ein bischen
wollte zu test- bzw. einarbeitungszwecken eine kleine bestehende WSDL datei per WSDL2JAVA tool in Code umwandeln lassen, aber allein am umwandeln scheitere ich schon...
kann mir vll jemand noch das generelle vorgehen beschreiben?
sprich mit welchem plugin ich das hinkriege?
ach und noch was? brauche ich eigentlich nen tomcat für den ganzen spaß?
fragen über fragen
wäre euch dankbar für ein paar antworten!
Also ich hab gerne XFire verwendet. (XFire)
Das ist jetzt aber irgendwie mit Apache CXF zusammengegangen.
Schau es Dir einfach mal an. Bei mir hat sich damals das ganze auf das Schreiben eines Interfaces, das Einbinden der XFire-Logic (ca. 3-10 Zeilen Code) und das Implementieren des Interfaces auf Serverseite reduziert.
Achja, einen extra Webserver hats da nicht gebraucht, weil das auf Jetty aufsetzt.
Ich hab mir sowohl XFire als Axis2 angeschaut. Ich finde zu keinem von beidem findet man wirklich gute Tutorials a la "from the scratch". Bin jedoch bei Axis2 geblieben da ich auch schon recht viel mit Axis1.4 gemacht habe.
Das Vorgehen ist wie folgt:
*Axis2 runter laden.
*Eventuell Ant runter laden, ist jedoch in Eclipse integriert.
*Projekt in Eclipse erstellen und eine Lib "axis2" mit allen jars im [axis2home]/lib Verzeichnis definieren. Lib zu Projekt hinzufügen
*Verzeichnis "wsdl" im Projekt anlegen und wsdl-Datei hineinkopieren
* ant-File erstellen, sollte NICHT build.xml heißen, da Axis2 ein eigenes build.xml erzeugt -> createservice.xml oder so:
*Dann rechts-klick auf das xml-File -> Run As -> Ant Build...auswählen --> Dialog öffnet sich
* Target "generate" auswählen und Dialog bestätigen --> Festplatte rattert und Code wird generiert
* Ebenfalls wird ein build.xml im Projekt-Root generiert. Dieses kann man ausführen (ACHTUNG! Variable "AXIS2_HOME" muss in der Umgebung gesetzt sein oder im build.xml das Property "axis2.home" selber setzen)
* rechts-klick auf build.xml -> Run As -> Ant Build... jar.server auswählen
* im Verzeichnis build/lib wird ein .aar File erstellt, dieses ist dein WebService und du kannst es in deiner WebApp deployen.
Die WebApp muss wie folgt aussehen:
Code:
[webapp]
[axis2-web] (einfach von axis2 Verzeichnis kopieren)
[WEB-INF]
[modules] (wieder aus axis2]
[services] (wieder aus axis2 -> hier gehört dein Service kopiert)
[lib] (hier die axis2 Bibliotheken kopieren)
web.xml gehört mit den Einträgen aus axis2 erweitert, einfach die Tags dazukopieren
Das wars, eigentlich sollte jetzt alles wie geschmiert laufen!
Bei Fragen einfach läuten
Braucht man dafür eigentlich spring oder rennt das auch ohne spring?
Soweit ich das mit XFire verstanden habe muss man das Service selber registrieren (mittels Code). Alleine das find ich schon schlecht!
wow. vielen dank für die ausführliche antwort niki!!! aber natürlich auch ein dank an die anderen
aber nachfragen muss ich wohl auf jedenfall. muss mich wohl zudem als linux noob outen
als hintergrundinfo: das ganze ist die vorbereitung für meine abschlussarbeit. und da die abteilung für die ich das mache mit linux arbeit, bin ich halt auch dazu verdammt
naja also folgendes:
1. habe mir axis2-1.2.jar runtergeladen. müsste richtig sein nehme ich an?!
2. so, ne lib(rary) definieren... wie was wo genau? ich weiß, dass ich unter properties unter java build path, dort unter libraries jars hinzufügen kann. aber was muss ich vorher mit dem axis2.jar file machen?
3. wenn ich schonmal dabei bin gib mir doch bitte noch nen tipp, wie ich mit eclipse ein ant-file erzeuge
dann probiere ich den rest erstmal, bis dann unweigerlich die nächsten fragen auftauchen *g*
Ich glaube nicht jeder hat den Bedarf, ein komplexes Framework wie Spring zu verwenden. Es gibt auch ganz simple Anwendungsfälle. Damals habe ich eine Administrationskonsole für meine Serveranwendung geschrieben. Da ging es einfach nur darum, Befehle, die der User am Client eingibt an den Server zu übertragen, dort auszuführen und das Resultat an den Client zurückzuliefern.
Hier hat es ausgereicht ein kleines Interface mit 1 Methode String execute (String comand) zu entwickeln, auf Serverseite dieses Interface zu implementieren und eine Webservice-Ohr zu starten. Der Client kann sich dann mit wenigen Codezeilen auf den Server connecten und loslegen.
Das Interface:
Code:
public interface IConsoleComandHandler
{
/**
* handles the user inputs
*
* @param cmd the comand or shortkey with all params
* @return the result
*/
public String executeComand(String cmd);
}
Die Serverlogik:
Code:
ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
// Create an XFire Service (console handler)
Service consoleHandlerService = serviceFactory.create(IConsoleComandHandler.class);
consoleHandlerService.setInvoker(new BeanInvoker(new ConsoleComandHandler()));
// Register the service in the ServiceRegistry
XFire xfire = XFireFactory.newInstance().getXFire();
xfire.getServiceRegistry().register(consoleHandlerService);
// Start the HTTP server
server = new XFireHttpServer();
server.setPort(this.port);
server.start();
Der Client:
Code:
ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
org.codehaus.xfire.service.Service serviceModel = serviceFactory.create(IConsoleComandHandler.class);
// Create a client proxy
XFireProxyFactory proxyFactory = new XFireProxyFactory();
try
{
IConsoleComandHandler handler = (IConsoleComandHandler) proxyFactory.create(serviceModel, webHandler);
String comand = getConsoleComand(handler);
while (!comand.equalsIgnoreCase(QUIT_COMAND) )
{
try
{
System.out.println(handler.executeComand(comand));
}
catch (Exception ex)
{
logger.error("AdminConsole.main(): Error executing the comand " + comand + ".", ex);
}
finally
{
comand = getConsoleComand(handler);
}
}
}
catch (MalformedURLException muex)
{
logger.error("The given adress of the server was not correct.", muex);
System.exit(-1);
}
Die Codebeispiele sind stark vereinfacht und unvollständig.
Es ist jedoch zu sehen, daß XFire sehr einfach zu verwenden ist.
1.) Es gibt schon axis2 in der Version 1.3, die habe ich verwendet
2.) im Eclipse auf Window -> Preferences... -> Java -> Build Path -> User Libraries -> New...
Namen vergeben und die jars über "Add Jars..." hinzufügen.
Dann das Projekt markieren.
Project -> Properties -> Java Build Path -> Add Library -> User Library -> und die definierte axis2 lib auswählen
3.) Einfach rechts-klick auf das Project -> New -> File -> createservice.xml als Dateinamen vergeben und schon ist es geschehn
puh, ich probier grad den ganzen vorgang nach zu vollziehen, um es später auch auf andere projekte anwenden zu können.
ok, das axisplugin liefert mir u.a. die möglichkeiten aus der wsdl code zu erzeugen. darum binde ich das als library ein (konnte man nicht eigentlich plugins einfach in den plugin ordner packen...?)
so, das antfile... :bahnhof:
1. woher haste du den ganzen "code" den du mir dazu gepostet hast? muss man das einfach drauf haben? *g*
2. und dieses antfile dient doch dazu die wsdl in den java code umzuwandeln oder? habe das mal vor einiger zeit bei nem PHP projekt gemacht. da konnte ich dann per rechtsklick auf die wsdl -> xyz ->... mich durchklicken und hatte dann irgendwann den erzeugten code. mich verwirrt also ein bischen das vorgehen mit diesem ant file
3. bekomme ich in zeile 32 einen fehler und beim drüber gucken ist mir in der 4. zeile das c:/javalibs aufgefallen. dat klappt wohl unter suse nicht so wirklich auf welches verzeichniss muss dieser wert genau gesetzt werden? welche java librarys werden da gebraucht?
PS kann sein, dass ich erst morgen wieder dazu komme hiermit weiter zu machen
Den Code hab ich aus Jahre langer Berufserfahrung. Mit der Zeit schreibt man das recht schnell herunter.
Ja, das Antfile dient zum Generieren der Java-Dateien
bei mir wären die Bibliotheken unter
c:/javalibs/[bibliothekenname]/[version der lib]
abgespeichert also:
c:/javalibs/axis2/1.3/
unter Linux wär das IMHO zb:
/javalibs/axis2/1.3
Ich hab noch nie unter SUSE gearbeitet, denke aber das es so ausschauen müsste
Der Fehler aus Zeile 32 dürfte daran liegen, weil er die Bibliotheken nicht findet. Also den Pfad /javalibs.... richtig setzen, dort wo halt axis2 entpackt ist
PS: kann es vll sein, dass ich die falsche datei runtergeladen habe?? vll hat jemand mal nen link für mich. einfach zur sicherheit, dass ich nicht mit wat ganz falschen hier arbeite
--> genau das war das problem... verdammt. hab mir jetzt mit nem windows rechner die 1.3er version gezogen entpackt und dann auf die linux kiste geschoben. jetzt habe ich auch alle ordner drin die benötigt werden.
so weiter gehts
1. in dem ganz oben geposteten code die zeile 44.
BUILD FAILED
...createservice.xml:44: org.apache.axis2.wsdl.codegen.CodeGenerationException: Error parsing WSDL
2. außerdem unterschlängelt der mir das '<wsdl2java>' in zeile 35 und meint 'element type "wsdl2java" must be declared'
mhh, hierbei fehlt mir das genaue verständniss von ant-files. ist das was relevantes? oder kann ich das ignorieren?
weiß nicht wie, aber den 1. fehler habe ich wegbekommen
so: hier ist mal mein aktueller code.habe ihn lediglich an wenigen stellen angepasst.
wenn ich jetzt das run as -> ant build laufen lasse. kommt ein fenster in dem folgendes steht:
'the user operation is waiting for "Building workspace" to complete.'
da drunter steht dann launching und 'the user operation is waiting for background work to complete: 1 work left'
das habe ich einfach mal 3-4 minuten laufen gelassen, aber es ist nichts weiter passiert. sollte ich nicht erst irgendwas auswählen, bevor der code generiert wird?
(ka warum das obere posting als gast gepostet wurde 0o)
edit: unten rechts in eclipse bleibt der launching status auch bei 0% stehen. es passiert also wirklich nichts
ich befasse mich auch mit dem Problem. Bin bereits schon so weit gekommen, dass die class-Dateien mit ant erstellt wurden. Jedoch klappt bei mir der folgende Schritte nich
Niki hat gesagt.:
...
* im Verzeichnis build/lib wird ein .aar File erstellt, dieses ist dein WebService und du kannst es in deiner WebApp deployen.
, da ich in diesem Verzeichnis nur 2 *.jar Dateien hab. Eine davon heißt ...-test-client.jar, abba wenn ich versuche diese auszuführen kommt ein Fehler, dass die main() Funktion fehlt. Was is da schief gelaufen? Ich arbeite mit Windows.
Wäre über Hilfe sehr dankbar.
ja schon, aber welches TARGET hast du von dem build.xml ausgeführt? Verwendest du eclipse? Wenn ja, mach einen rechtsklick auf die build.xml, dann Run As --> Run Ant... (Das untere der beiden Menüpunkte) und wähl jar.server aus
okay hab das target in der Build.xml gefunden, abba bei "öffnen mit" is bei mir kein "Run Ant"
ich glaube ich hab das Programm nicht installiert. hab einfach über die Eingabeaufforderung versucht ant zu benutzen
Die kopierst du ins WEB-INF/services Verzeichnis von axis2 oder deiner WebApp. Ich hab eine lange Beschreibung zum Vorgehen gepostet. Lies dir das einfach mal durch, das sollte dir weiter helfen
oki, hast ja oben geschrieben
Abba ich versteh die vorgehensweise nich ganz
was is das für ne Programmiersprache bzw. wie bekomme ich das in geeigneter Form, dass ich es auf ner HTML-Seite nutzen kann?
Das kannst du so nicht in einer html Seite verwenden.
Das ganze funktioniert so:
Es gibt zwei Möglichkeiten:
1.) Du besitzt von irgendwo eine wsdl-Datei, die dein Service beschreibt (contract first)
* Dann kannst du aus der wsdl deine java-sourcen generieren lassen und dir das .aar File erstellen lassen. Dieses ist dein Service, welches du in deiner Webapplikation deployen kannst. Die WebApplikation muss bestimmte Bibliotheken von axis2 haben bzw. die Servlets von axis2 gehören in deiner web.xml ebenfalls definiert
2.) Du willst ein komplett neues Service erstellen (code first)
* Erstell dein Service Interface und/oder Implementierungsklasse
* Erzeuge die wsdl anhand des Interfaces/Klasse
* gehe weiter wie bei Schritt 1 vor
Um das ganze laufen zu lassen brauchst du einen Servlet Container (z.B Tomcat). Hast du dein WebService erstellt und deployt kannst du dir aus der wsdl auch den Client Code generieren lassen. Dieser ruft dann das Service tatsächlich auf!
hab ich dann jetz nen Web Service generiert?
Ich wollt eigentlich nen Client haben, der den Web Service nutzt und nen Request daran setzt und die Antwort anzeigt
@lr
Ich hab schon relativ viel mit axis1.4 gemacht, daher ist mir axis2 auch nicht sooo schwer gefallen. bei XFire hat mich irritiert dass ich spring braucht, ich bekam die ganze zeit fehlermeldungen, dass irgendwelche Beans nicht gefunden werden konnten. Ich mag auch nicht per code mein Service registrieren müssen, das Framework soll selber erkennen das da ein service ist
@snakeho wenn du ein service ansprechen willst brauchst du dir nur den Client generieren lassen.
ich vermute das hast du schon gemacht, jetzt brauchst du halt deine java-klasse wo du den aufruf implementierst
Also komm ich mit deinem ersten beitrag nicht zum Client, oda is der jetz schon als Nebenrodukt entstanden?
Sorry, dass ich so schwer von Begriff bin. Ich seh die Dinge nich immer gleich auch wenn sie schon da stehen.
Schau mal nach ob dir eine Datei namens [Server]Stub.java generiert worden ist. Wenn ja, ist das deine Client Klasse mit der du dein Service ansprechen kannst:
Code:
MyServiceStub stub = new MyServiceStub("http://localhost:8080/mywebapp/services/MyService");
stub.machWasAmServer();
@lr
Ich hab schon relativ viel mit axis1.4 gemacht, daher ist mir axis2 auch nicht sooo schwer gefallen. bei XFire hat mich irritiert dass ich spring braucht, ich bekam die ganze zeit fehlermeldungen, dass irgendwelche Beans nicht gefunden werden konnten. Ich mag auch nicht per code mein Service registrieren müssen, das Framework soll selber erkennen das da ein service ist
Klar, für Deine Anforderungen macht so eine integrierte Lösung keinen Sinn. XFire hatte seinerzeit einen ziemlichen Affenschwanz an Dependencies. Wahrscheinlich hast Du einfach nicht alle eingebunden, die es gebraucht hat.
Werd mich bei Gelegenheit mal an dieses CXF machen.
Es wäre toll wenn du ein kleines "from the scratch with XFire" tutorial hier posten könntest. Sowas habe ich im Netz leider nirgends gefunden. Axis2 hat leider auch extrem viele Abhängigkeiten. Ich bin mir aber ziehmlich sicher dass ich bei XFire alle libs eingebunden hatte. Die Konfiguration dürfte nur noch nicht gestimmt haben.
Es wäre toll wenn du ein kleines "from the scratch with XFire" tutorial hier posten könntest. Sowas habe ich im Netz leider nirgends gefunden. Axis2 hat leider auch extrem viele Abhängigkeiten. Ich bin mir aber ziehmlich sicher dass ich bei XFire alle libs eingebunden hatte. Die Konfiguration dürfte nur noch nicht gestimmt haben.
Yep, du musst eine Java Datei schreiben. Du kannst die location für das WebService auch als start-Argument mitgeben, aber normalerweise ändert sich die Location eines Service ja nicht täglich. Ein Property-File wäre auch eine Möglichkeit das ganze dynamisch zu halten.
Normalerweise steht in der wsdl Datei die URL vom Service drin. Die wird auch als default Wert genommen, wenn man beim Konstruktor des Stubs nichts übergibt
package net.webservicex.www;
public class test{
CurrencyConvertorStub stub=new CurrencyConvertorStub();
}
da sacht er mir nen Fehler, dass der Konstruktor damit nich arbeiten kann auch wenn ich die url angebe klappt das nich
die Datei liegt im selben Ordner, wo auch die CurrencyConvertorStub.java is
Ja, weil der Konstruktor eine Exception werfen kann und du das ganze als Attribut verwendest. Schreib das ganze in eine Methode (z.B. main) und bau einen try-catch Block darüber
Die Methode nennt sich "ins kalte Wasser werfen" und kann verschiedene Resultate erzeugen, wie z.B.: "geht unter" oder "kann schwimmen"
Aber mal ganz nebenbei, das ist in einigen Firmen absolut gängig. Hab mal in einer gearbeitet, da wurde immer der mit einer Aufgabe betreut, der davon am wenigsten Ahnung hatte. Die Logik dahinter blieb mir leider verborgen
Ahhh, das ist natürlich sehr klug und wirtschaftlich. Wär vielleicht klüger gewesen einen Erfahrenen mit einem Unerfahrenem zusammen zu tun.
Es gibt schon eigenartige Firmen....
ganz so wenig Ahnung mit Java hab ich auch nich,
hab auch schon einige Programme mit Java geschrieben
bin allerdings Student und als solcher muss man mit allerhand Programmiersprachen klar kommen
wenn man dann ne Weile eine nich mehr benutzt hat, muss man erstma wieda reinkommen
Richtig, am besten ist jedoch das sogenantne "wirf alles weiter Pattern" einzusetzen. Bei allen Methoden einfach throws Throwable deklarieren und im main-Thread einen fetten try-catch Block zu bauen! Dann ist man immer auf der sicheren Seite.
:autsch:
Richtig, am besten ist jedoch das sogenantne "wirf alles weiter Pattern" einzusetzen. Bei allen Methoden einfach throws Throwable deklarieren und im main-Thread einen fetten try-catch Block zu bauen! Dann ist man immer auf der sicheren Seite.
:autsch: