WebService mit JEE5 (ohne NetbeansAssistenten) und JBoss 4.2

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
 
Hallo Tom,

Danke für den Link und für das Beispiel.

Ich bräuchte eine Idee wie ich ein WebService "händisch, manuell" ohne NetBeans bei einem Application Server z.B. JBoss deploy.

Hast du das schon mal händisch gemacht ?!

Gruss
Dietmar
 
Hallo,

für JBoss 4.x musst du dir für JAXWS Webservices einen patch herunterladen:
http://labs.jboss.com/jbossws/downloads/
http://labs.jboss.com/file-access/default/members/jbossws/downloads/Install-2.0.2.GA.txt

JAXWS webservices können in JBossWS als .war Archive deployed werden.

Beispiel:

Unser JAX-WS Webservice:
Java:
/**
 * 
 */
package de.tutorials;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

/**
 * @author Thomas.Darimont
 *
 */
@WebService(name="EndpointInterface",targetNamespace="http://ws.tutorials.de/services",serviceName="Calculator")
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class Calculator {
    @WebMethod
    @WebResult(name="sum")
    public double sumFor(@WebParam(name="firstNumber") double firstNumber, @WebParam(name="secondNumber") double secondNumber){
        return firstNumber+ secondNumber;
    }
}

web.xml
XML:
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>Calculator</servlet-name>
    <servlet-class>de.tutorials.Calculator</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Calculator</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

Das in ein war zusammenpacken (siehe Anhang) und in das entsprechende server/deploy Verzeichnis kopieren.:

Code:
13:43:01,984 INFO  [DefaultEndpointRegistry] register: jboss.ws:context=de.tutorials.training.webservices.jaxws,endpoint=Calculator
13:43:02,015 INFO  [TomcatDeployer] deploy, ctxPath=/de.tutorials.training.webservices.jaxws, warUrl=.../tmp/deploy/tmp64747de.tutorials.training.webservices.jaxws-exp.war/
13:43:02,359 INFO  [WSDLFilePublisher] WSDL published to: file:/D:/stuff/jboss/4.2.2GA/jboss-4.2.2.GA/server/all/data/wsdl/de.tutorials.training.webservices.jaxws.war/Calculator64748.wsdl

Anschließend unter:
http://localhost:8080/jbossws/
bzw.
http://localhost:8080/jbossws/services

Die deployedten Web Services anzeigen lassen.

Das WSDL das für unseren Webservice generiert wurde schaut dann so aus:
http://127.0.0.1:8080/de.tutorials.training.webservices.jaxws?wsdl
XML:
<definitions name='Calculator' targetNamespace='http://ws.tutorials.de/services' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://ws.tutorials.de/services' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
 <types></types>
 <message name='EndpointInterface_sumForResponse'>
  <part name='sum' type='xsd:double'></part>
 </message>
 <message name='EndpointInterface_sumFor'>
  <part name='firstNumber' type='xsd:double'></part>
  <part name='secondNumber' type='xsd:double'></part>
 </message>

 <portType name='EndpointInterface'>
  <operation name='sumFor' parameterOrder='firstNumber secondNumber'>
   <input message='tns:EndpointInterface_sumFor'></input>
   <output message='tns:EndpointInterface_sumForResponse'></output>
  </operation>
 </portType>
 <binding name='EndpointInterfaceBinding' type='tns:EndpointInterface'>
  <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/>
  <operation name='sumFor'>

   <soap:operation soapAction=''/>
   <input>
    <soap:body namespace='http://ws.tutorials.de/services' use='literal'/>
   </input>
   <output>
    <soap:body namespace='http://ws.tutorials.de/services' use='literal'/>
   </output>
  </operation>
 </binding>

 <service name='Calculator'>
  <port binding='tns:EndpointInterfaceBinding' name='EndpointInterfacePort'>
   <soap:address location='http://127.0.0.1:8080/de.tutorials.training.webservices.jaxws'/>
  </port>
 </service>
</definitions>

Fertig.

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Zurück