derDietmar
Grünschnabel
ich möchte ein WebService bereitstellen und testen.
Dabei bin ich nach einem Buch Java EE5, Thomas Stark Kapitel 13 vorgegangen.
Hab leider dabei Probleme.
An dieser Stelle müßte jetzt eigentlich der Satz kommen:
"Wie aus meinen Fragen erkennbar ist, bin ich auf Beginner-Level was Web-Applications betrifft.
Daher ersuche ich um Nachsicht oft trivialer oder falscher Fragen!"
Meine Schritte:
1) Erstelle in NetBeans das Projekt WS13 als Standard-Applikation (nicht als WEB -Applikation)
2) Binde auch entsprechende Libs ein.
3) Erstelle Klasse SoapService
=> kompiliert erfolgreich ohne Warnungen.
--------------------------------
package de.akdabas.javaee.ws;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.soap.SOAPMessage;
@Stateless
@WebService(name = "TestService")
/**
* Dieser Service nimmt eine SOAP-Nachricht entgegen, gibt Sie aus
* und sendet die Nachricht anschließend wieder zurück
*/
public class SoapService extends JAXMServlet {
@WebMethod
public SOAPMessage invoke(SOAPMessage message) {
try {
// Ausgabe der empfangen Nachricht auf der Kommandozeile
message.writeTo(System.out);
} catch (Exception exc) {
exc.printStackTrace();
}
// Zurücksenden der Nachricht als Bestätigung
return message;
}
}
--------------------------------
4) Und jetzt meine eigentlichen WEB-Probleme: Wie kann unter JBoss mein SoapService bereitstellen und testen?
(da hab ich leider auch im Internet nichts gefunden)
Meine Schritte laut dem Buch Java EE5:
a) JBoss gestartet und ich kann im Browser mit http://localhost:8080 die Admin-Web-Seite sehen
b) Ich hab ein build der 3 Java-Klassen erzeugt => dadurch wird eine WS13.jar Datei erzeugt (WS13, weil Projekt-Name WS13)
c) Ich habe WS13.jar nach ..\JBoss\server\default\deploy kopiert
d) und jetzt
d)Kann ich das Service in einem Browsertesten: Meine Versuche scheiterten:
http://localhost:8080/WS13/SoapService
http://localhost:8080/WS13/TestService
usw.
Unklar ist auch wo ich den name "TestService" verwende?!
**************************************************************
Habe auch einen Java Client verwendet (auch aus dem Java EE 5 BUCH).
Meine Schritte:
i) Im gleichen Projekt die Klasse SoapClient erzeugt
ii) Entsprechende Libs eingebunden.
Mein Problem: Wie kann ich mit dem SoapClient testen?
Unter NetBeans auf Run liefert => java.lang.NullPointerException
an der Stelle: SoapService ws = service.getPort(SoapService.class);
In der Klasse SoapClient ist mir der Referenzverweis nicht klar:
Wieso "http://java:8080/..." und nicht http://localhost:8080/..."
----------------------------------
package de.akdabas.javaee.ws;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceRef;
import javax.xml.soap.SOAPMessage;
/**
* Ein einfacher Client für eine SOAP Nachrichten
*/
public class SoapClient {
// Referenz auf den Webservice
@WebServiceRef(
wsdlLocation = "http://java:8080/kap13/SoapService?wsdl"
)
static Service service;
/**
* Diese Methode dient zum Testen der Methode 'doInvokeService()'
*/
public static void main(String[] args) {
SoapClient client = new SoapClient();
client.doInvokeService();
}
/**
* Erzeugt mit Hilfe des 'SoapMessageBuilder' eine neue SOAP
* Nachricht, sendet diese an den 'SoapService' und gibt die
* empfangene Antwort aus.
*/
public void doInvokeService() {
try {
// Erstellen eines neuen Message Builders und Erzeugen
// einer SOAP Nachricht
SoapMessageBuilder msgBuilder = new SoapMessageBuilder();
SOAPMessage message = msgBuilder.createMessage();
// Referenzieren des Services
SoapService ws = service.getPort(SoapService.class);
// Sender der Nachricht und Empfang der Antwort
SOAPMessage response = ws.invoke(message);
// Ausgabe der Antwort-Nachricht
response.writeTo(System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
----------------------------
package de.akdabas.javaee.ws;
import javax.xml.soap.*;
/**
* Diese Klasse demonstriert das Erzeugen einer SOAP-Nachricht mit
* Hilfe der API 'javax.xml.soap'
*/
public class SoapMessageBuilder {
/**
* Diese Methode dient zum Testen der Methode 'createMessage()'
*/
public static void main(String[] args) throws Exception {
SoapMessageBuilder smb = new SoapMessageBuilder();
SOAPMessage message = smb.createMessage();
message.writeTo(System.out);
}
/**
* Erzeugt eine SOAP-Message
*/
public SOAPMessage createMessage() throws SOAPException {
// Erzeugen der SOAP Message-Factory
MessageFactory mf = MessageFactory.newInstance();
// Erzeugen einer neuen SOAP Nachricht
SOAPMessage message = mf.createMessage();
// Zugriff auf den SOAP Body, der später die Nuetzdaten trägt
SOAPPart part = message.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
SOAPBody body = envelope.getBody();
// Erzeugen des Wurzelelementes '<contact>' der Nutzdaten
Name root = envelope.createName("contact");
// Einfügen des Elementes in den SOAP Body
SOAPBodyElement rootElement = body.addBodyElement(root);
// Hinzufügen des Attributes 'status="new"'
Name status = envelope.createName("status");
rootElement.addAttribute(status, "new");
// Aufbau und Einfügen des Elementes '<name>'
Name contactName = envelope.createName("name");
SOAPElement soapElementName =
rootElement.addChildElement(contactName);
soapElementName.addTextNode("Thomas Stark");
// Aufbau und Einfügen des Elementes '<email>'
Name contactEmail = envelope.createName("email");
SOAPElement soapElementEmail =
rootElement.addChildElement(contactEmail);
soapElementEmail.addTextNode("thomas@masterclass.de");
return message;
}
}
----------------------------------------------
Das war's
leider die üblichen Verständnisschwierigkeiten bei einem Sart eines doch riesigen Themas
Wer hat eine Lösung oder ein ähnliches kleines Programm, damit mir einfach die Vorgänge klarer werden.
lg
Dietmar
Anhang
Dabei bin ich nach einem Buch Java EE5, Thomas Stark Kapitel 13 vorgegangen.
Hab leider dabei Probleme.
An dieser Stelle müßte jetzt eigentlich der Satz kommen:
"Wie aus meinen Fragen erkennbar ist, bin ich auf Beginner-Level was Web-Applications betrifft.
Daher ersuche ich um Nachsicht oft trivialer oder falscher Fragen!"
Meine Schritte:
1) Erstelle in NetBeans das Projekt WS13 als Standard-Applikation (nicht als WEB -Applikation)
2) Binde auch entsprechende Libs ein.
3) Erstelle Klasse SoapService
=> kompiliert erfolgreich ohne Warnungen.
--------------------------------
package de.akdabas.javaee.ws;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.soap.SOAPMessage;
@Stateless
@WebService(name = "TestService")
/**
* Dieser Service nimmt eine SOAP-Nachricht entgegen, gibt Sie aus
* und sendet die Nachricht anschließend wieder zurück
*/
public class SoapService extends JAXMServlet {
@WebMethod
public SOAPMessage invoke(SOAPMessage message) {
try {
// Ausgabe der empfangen Nachricht auf der Kommandozeile
message.writeTo(System.out);
} catch (Exception exc) {
exc.printStackTrace();
}
// Zurücksenden der Nachricht als Bestätigung
return message;
}
}
--------------------------------
4) Und jetzt meine eigentlichen WEB-Probleme: Wie kann unter JBoss mein SoapService bereitstellen und testen?
(da hab ich leider auch im Internet nichts gefunden)
Meine Schritte laut dem Buch Java EE5:
a) JBoss gestartet und ich kann im Browser mit http://localhost:8080 die Admin-Web-Seite sehen
b) Ich hab ein build der 3 Java-Klassen erzeugt => dadurch wird eine WS13.jar Datei erzeugt (WS13, weil Projekt-Name WS13)
c) Ich habe WS13.jar nach ..\JBoss\server\default\deploy kopiert
d) und jetzt
d)Kann ich das Service in einem Browsertesten: Meine Versuche scheiterten:
http://localhost:8080/WS13/SoapService
http://localhost:8080/WS13/TestService
usw.
Unklar ist auch wo ich den name "TestService" verwende?!
**************************************************************
Habe auch einen Java Client verwendet (auch aus dem Java EE 5 BUCH).
Meine Schritte:
i) Im gleichen Projekt die Klasse SoapClient erzeugt
ii) Entsprechende Libs eingebunden.
Mein Problem: Wie kann ich mit dem SoapClient testen?
Unter NetBeans auf Run liefert => java.lang.NullPointerException
an der Stelle: SoapService ws = service.getPort(SoapService.class);
In der Klasse SoapClient ist mir der Referenzverweis nicht klar:
Wieso "http://java:8080/..." und nicht http://localhost:8080/..."
----------------------------------
package de.akdabas.javaee.ws;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceRef;
import javax.xml.soap.SOAPMessage;
/**
* Ein einfacher Client für eine SOAP Nachrichten
*/
public class SoapClient {
// Referenz auf den Webservice
@WebServiceRef(
wsdlLocation = "http://java:8080/kap13/SoapService?wsdl"
)
static Service service;
/**
* Diese Methode dient zum Testen der Methode 'doInvokeService()'
*/
public static void main(String[] args) {
SoapClient client = new SoapClient();
client.doInvokeService();
}
/**
* Erzeugt mit Hilfe des 'SoapMessageBuilder' eine neue SOAP
* Nachricht, sendet diese an den 'SoapService' und gibt die
* empfangene Antwort aus.
*/
public void doInvokeService() {
try {
// Erstellen eines neuen Message Builders und Erzeugen
// einer SOAP Nachricht
SoapMessageBuilder msgBuilder = new SoapMessageBuilder();
SOAPMessage message = msgBuilder.createMessage();
// Referenzieren des Services
SoapService ws = service.getPort(SoapService.class);
// Sender der Nachricht und Empfang der Antwort
SOAPMessage response = ws.invoke(message);
// Ausgabe der Antwort-Nachricht
response.writeTo(System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
----------------------------
package de.akdabas.javaee.ws;
import javax.xml.soap.*;
/**
* Diese Klasse demonstriert das Erzeugen einer SOAP-Nachricht mit
* Hilfe der API 'javax.xml.soap'
*/
public class SoapMessageBuilder {
/**
* Diese Methode dient zum Testen der Methode 'createMessage()'
*/
public static void main(String[] args) throws Exception {
SoapMessageBuilder smb = new SoapMessageBuilder();
SOAPMessage message = smb.createMessage();
message.writeTo(System.out);
}
/**
* Erzeugt eine SOAP-Message
*/
public SOAPMessage createMessage() throws SOAPException {
// Erzeugen der SOAP Message-Factory
MessageFactory mf = MessageFactory.newInstance();
// Erzeugen einer neuen SOAP Nachricht
SOAPMessage message = mf.createMessage();
// Zugriff auf den SOAP Body, der später die Nuetzdaten trägt
SOAPPart part = message.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
SOAPBody body = envelope.getBody();
// Erzeugen des Wurzelelementes '<contact>' der Nutzdaten
Name root = envelope.createName("contact");
// Einfügen des Elementes in den SOAP Body
SOAPBodyElement rootElement = body.addBodyElement(root);
// Hinzufügen des Attributes 'status="new"'
Name status = envelope.createName("status");
rootElement.addAttribute(status, "new");
// Aufbau und Einfügen des Elementes '<name>'
Name contactName = envelope.createName("name");
SOAPElement soapElementName =
rootElement.addChildElement(contactName);
soapElementName.addTextNode("Thomas Stark");
// Aufbau und Einfügen des Elementes '<email>'
Name contactEmail = envelope.createName("email");
SOAPElement soapElementEmail =
rootElement.addChildElement(contactEmail);
soapElementEmail.addTextNode("thomas@masterclass.de");
return message;
}
}
----------------------------------------------
Das war's
leider die üblichen Verständnisschwierigkeiten bei einem Sart eines doch riesigen Themas
Wer hat eine Lösung oder ein ähnliches kleines Programm, damit mir einfach die Vorgänge klarer werden.
lg
Dietmar
Anhang