# Einfache Webservices unter Java 6 Mustang



## Thomas Darimont (23. März 2007)

Hallo,

hier mal ein kleines Beispiel für die Erstellung und Verwendung eines Webservices
unter Java 6:

Unser ICalculator interface:

```
package de.tutorials;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Use;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
//@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = Use.ENCODED)
interface ICalculator {
  @WebMethod
  int computeSumOf(int a, int b);
}
```

Unsere Calculator Implementierung:

```
package de.tutorials;

import javax.jws.WebService;

/**
 * @author Tom
 */
@WebService(serviceName = "Calculator", portName = "Calculator", endpointInterface = "de.tutorials.ICalculator")
public class Calculator implements ICalculator {
  public int computeSumOf(int a, int b) {
    return a + b;
  }
}
```

Unser Exporter / Client:

```
/**
 * 
 */
package de.tutorials;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Endpoint;
import javax.xml.ws.Service;

/**
 * @author Tom
 */
public class SimpleWebServiceExample {
  public static void main(String[] args) throws Exception {
    Endpoint endpoint = null;
    try {
      endpoint = Endpoint.publish("http://localhost:44444/Calculator", new Calculator());
      System.out.println("Service Published!");
      Service service = Service.create(new URL("http://localhost:44444/Calculator?wsdl"), new QName(
        "http://tutorials.de/", "Calculator"));
      ICalculator simpleService = service.getPort(ICalculator.class);

      System.out.println(simpleService.computeSumOf(11, 12));
    } finally {
      //endpoint.stop();
    }
  }
}
```

Ausgabe:

```
Service Published!
23
```

Die Annotation 
	
	
	



```
@SOAPBinding(style = SOAPBinding.Style.RPC)
```
im ICalculator ist notwendig, da sonst als Default SOPABinding  DocumentStyle verwendet wird
und die Laufzeit dann nach den entsprechenden Operations / Request / Response Wrapper Klassen sucht...
Deshalb bekommt man dann diese Exception:

```
...
@WebService
//@SOAPBinding(style = SOAPBinding.Style.RPC)
interface ICalculator {
```
Resultiert in:

```
Exception in thread "main" Server Runtime Error: class: de.tutorials.jaxws.ComputeSumOf could not be found
    at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:269)
    at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:87)
    at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:59)
    at javax.xml.ws.Endpoint.publish(Endpoint.java:156)
    at de.tutorials.SimpleWebServiceExample.main(SimpleWebServiceExample.java:19)
Caused by: class: de.tutorials.jaxws.ComputeSumOf could not be found
    at com.sun.xml.internal.ws.modeler.RuntimeModeler.getClass(RuntimeModeler.java:271)
    at com.sun.xml.internal.ws.modeler.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:562)
    at com.sun.xml.internal.ws.modeler.RuntimeModeler.processMethod(RuntimeModeler.java:509)
    at com.sun.xml.internal.ws.modeler.RuntimeModeler.processClass(RuntimeModeler.java:355)
    at com.sun.xml.internal.ws.modeler.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:251)
    at com.sun.xml.internal.ws.server.RuntimeEndpointInfo.createSEIModel(RuntimeEndpointInfo.java:170)
    at com.sun.xml.internal.ws.server.RuntimeEndpointInfo.init(RuntimeEndpointInfo.java:317)
    at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:298)
    at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:263)
    ... 4 more
```

Unser WSDL:

```
<definitions targetNamespace="http://tutorials.de/" name="Calculator">
<types/>
?
	<message name="computeSumOf">
<part name="arg0" type="xsd:int"/>
<part name="arg1" type="xsd:int"/>
</message>
?
	<message name="computeSumOfResponse">
<part name="return" type="xsd:int"/>
</message>
?
	<portType name="ICalculator">
?
	<operation name="computeSumOf" parameterOrder="arg0 arg1">
<input message="tns:computeSumOf"/>
<output message="tns:computeSumOfResponse"/>
</operation>
</portType>
?
	<binding name="CalculatorBinding" type="tns:ICalculator">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
?
	<operation name="computeSumOf">
<soap:operation soapAction=""/>
?
	<input>
<soap:body use="literal" namespace="http://tutorials.de/"/>
</input>
?
	<output>
<soap:body use="literal" namespace="http://tutorials.de/"/>
</output>
</operation>
</binding>
?
	<service name="Calculator">
?
	<port name="Calculator" binding="tns:CalculatorBinding">
<soap:address location="http://localhost:44444/Calculator"/>
</port>
</service>
</definitions>
```

Das Beispiel ist sogar so einfach, dass man sogar von einem C# Client aus den WebService ohne Probleme benutzen kann 

Gruß Tom


----------



## Proko (21. Mai 2007)

Thomas Darimont hat gesagt.:


> Das Beispiel ist sogar so einfach, dass man sogar von einem C# Client aus den WebService ohne Probleme benutzen kann



das soll ja auch der sinn eines webservices sein 

abstraktion des codes => dieser wird in XML beschrieben/gebettet

dadurch soll er sprachunabhängig, plattformunabhängig und typsicher sein

mfg


----------



## Thomas Darimont (21. Mai 2007)

Hallo,



> das soll ja auch der sinn eines webservices sein
> 
> abstraktion des codes => dieser wird in XML beschrieben/gebettet
> 
> dadurch soll er sprachunabhängig, plattformunabhängig und typsicher sein


Nein... echt? ;-)

Das ist schon klar... wenn man den Contract First Ansatz wählt (man designed die Webservice Definition / die ausgetauschten Nachrichten in XML über WSDL) ist das mit der Interoperabilität in der Regel auch kein Problem. Da ich hier jedoch das WSDL (under the hood) on the fly generieren lasse ist das mit der Interoperabilität nicht so einfach, aber in diesem Fall (da hier nur primitive und Strings ausgetauscht werden) ist das kein Problem. Wenn ich jedoch versuche ein Datum (java.util.Date) auszutauschen wirds schon etwas früher knallen ;-)

Gruß Tom


----------



## cipher (23. Mai 2007)

Hallo,

bin gerade dabei mich in Client-Seite der Web Services unter JAVA einzuarbeiten und werde aus der Generierung des dynamischen Stubs nicht ganz schlau.

Ist es auf der Serverseite zwingend notwendig, die WebMethod innerhalb eines Interfaces zu deklarieren und worin liegt der Sinn eines dynamisch generierten Stubs wenn mein Client für den Aufruf der WebMethod das zugehörige Interface kennen muss ?


----------



## winniwinter (23. Mai 2007)

ich beschäftige mich ebenfalls mit dem thema webservice,

Momentan habe ich probleme meine Ausgabe dem Client zukommen zulassen. Bevor ich überhaupt noch weiter mache, könnte sich jmd meinen Code mal angucken, da ich nicht der überprofi in Java bin.

```
#Klasse AngebotsAufrufe()
package AngebotService;

import java.io.*;
import java.net.URI;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.awt.Desktop;




public class AngebotsAufrufe extends CopyAngebot
{
    String usr, pwd, host;
    String speicherort 	= 	null;
    String	verzeichnis = 	null;
  	String	bemerkung   = 	"test";
  	String	datum	    = 	"test";
  	String 	uhrzeit     = 	"test";
  	String response		=	null;
  	String angebotsnr 	= 	null;
	Connection con 		= 	null;
	Statement smt  		= 	null;
	Reader datei		= 	null;
	Desktop desk		= 	Desktop.getDesktop();
	
	

	public Desktop CreateAngebot(String pdffile)
	{
		angebotsnr = pdffile;
		usr  = "dewea083";
		pwd  = "";
		host = "jdbc:mysql://localhost:3306/Angebotsspeicher"; 						//Datenbank auf Server
		if(pdffile == null)
		{
			System.out.println("ERROR ANGEBOT CANNOT BE NULL!");
			return null;
		}
		else
		{ 
			try
			{					 	

				src 					= "/home/dewea083/Documents/1178526328411.pdf";		 	 																	//mkordner = new File("/usr/share/tomcat/webapps/pdf/"+angebotsnr).mkdir();		//erstelle einen Ordner der die AngebotsNummer hat
				CopyAngebot daten 	= new CopyAngebot();		 	 
		 	 	dest 					= "/srv/www/htdocs/pdf/"+pdffile+".pdf";							//gibt den Speicherort und den Dateinamen für das Angebot an
		 	 	daten.copyFile(src, dest); 										//Datei wird in das Verzeichnis kopiert		 	 

		 	 	verzeichnis = dest;
		 	 	Class.forName("com.mysql.jdbc.Driver");
		 	 	con 		 = DriverManager.getConnection(host, usr, pwd);																		//formatiert den Verzeichnisnamen so, dass er in der Datenbank gespeichert werden kann
		 	 	smt		 = con.createStatement();						
		 	 	String sql2 = "INSERT INTO Angebotverzeichnis(AngebotsNr,Verzeichnis,Bemerkung,Datum,Uhrzeit)" +
			 		       "VALUE(" +angebotsnr+ ",\"" +verzeichnis+ "\",\"" +bemerkung+"\",\"" +datum+ "\",\"" +uhrzeit+"\");";	
			 
		 	 	smt.executeUpdate(sql2);											//Daten vom Angebot werden in der DB gespeichert	 

		 	 	System.out.println("Angebot "+pdffile+".pdf"+" wurde erstellt");
		 	 	response = "Neues PDF erstellt, jetzt bitte anzeigen";
		 	 	con.close();
		 	 	smt.close();
		 	 	desk.browse(new URI("http://10.100.0.27/pdf/"+pdffile));
		 	 	return desk;
			}		
			catch(Exception ex)
			{						
			System.out.println(ex);
			return null;
			}
		}
	}	
	
	public String GetAngebot(String pangebot)
	{
		usr  = "dewea083";
		pwd  = "";
		host = "jdbc:mysql://localhost:3306/Angebotsspeicher"; //Datenbank auf Server
		if(pangebot == null)
		{
			System.out.println("ERROR ANGEBOT CANNOT BE NULL!");
			return null;
		}
		else
			{	
				try
				{	
				 System.out.println("Gesucht wird: "+pangebot);
				 Class.forName("com.mysql.jdbc.Driver");				//JDBC Treiber laden
				 con = DriverManager.getConnection(host, usr, pwd);		//Verbindung aufbauen
				 smt =con.createStatement();
				 String sql = "SELECT AngebotsNr From Angebotsspeicher.Angebotverzeichnis " +
				 			  "WHERE AngebotsNr ="+pangebot;
				 ResultSet rst = smt.executeQuery(sql);					//SQL Anweisung ausführen
				 System.out.println("Angebot wird gesucht");			//Es wird nach der Angebotsnummer gesucht
				 
				 
				 	while (rst.next())
				 	{
					 speicherort = rst.getString(1);				   //Gib mir das Verzeichnis wo die Datei liegt 
				 	}
					 con.close();
					 smt.close();
				}
				catch(Exception ex)
				{						
				System.out.println(ex);
				return null;
				}
				if (speicherort == null)
				{
					AngebotsAufrufe ca1 = new AngebotsAufrufe();
					ca1.CreateAngebot(pangebot);
					response = "Angebot nicht vorhanden. Erstelle es jetzt";	
				}
				else
				{
					System.out.println("Angebot "+pangebot +" bereits vorhanden");
					response = "Angebots vorhanden, ich zeige es dir jetzt an";
				}
				return response;
			}
	}
	
	public void pdfanzeigen(String pdf)
	{
		try {desk.browse(new URI("http://10.100.0.27/pdf/"+pdf)); }
		catch(Exception ex) {}
	}
}

#Klasse AngebotsService
package AngebotService;


import java.awt.Desktop;




public class AngebotsService 
{

	public String findeAngebot(String fangebot)
	{
		AngebotsAufrufe aa1 = new AngebotsAufrufe();
		return aa1.GetAngebot(fangebot);
	}

	public Desktop erstelleAngebot(String eangebot)
	{
		AngebotsAufrufe aa2 = new AngebotsAufrufe();
		return aa2.CreateAngebot(eangebot);
	}

}
```

Der Service soll später mal dem User eine PDF zurück geben, bzw. wenn diese noch nicht existiert soll er sie generieren und im Anschluss dem Benutzer schicken.
Ich hänge jedoch schon die gnaze zeit daran wie ich diese dem Benutzer senden kann

Wie man sieht habe ich es mit der awt.Destkop klasse versucht, jedoch t das nicht. 
Ist also nur ein "TestCode"


----------



## Proko (23. Mai 2007)

cipher hat gesagt.:


> Hallo,
> 
> bin gerade dabei mich in Client-Seite der Web Services unter JAVA einzuarbeiten und werde aus der Generierung des dynamischen Stubs nicht ganz schlau.
> 
> Ist es auf der Serverseite zwingend notwendig, die WebMethod innerhalb eines Interfaces zu deklarieren und worin liegt der Sinn eines dynamisch generierten Stubs wenn mein Client für den Aufruf der WebMethod das zugehörige Interface kennen muss ?



wenn du einen webservice erstellst z.bsp. in C# sieht das ja so aus...
[Webservice...]
class Service  : System.Web.Services.WebService {
  [WebMethod]
  public String HelloWorld() {...}
}

wo soll hier das interface sein? das ist eine ganz normale klasse, nachdem du deinen web service server nicht in JAVA hast, nehme ich an, du hast in .NET entwickelt, wenn du dir ein neues WebService projekt anlegst sieht das so in etwa aus (wie gesagt, seh ich des net als interface)

die informationen dieser klasse werden in ein xml format gepackt, und ein client kann sich diese holen

wenn du unter java auf den webservice zugreifst, wir ein objekt WebServiceXY erstellt, welches als art proxy dient
dieses proxy bietet dann die selben methoden, die auch der webservice bietet und somit kannst du dann die methoden des webservices nutzen

der proxy/stub ist die verbindung zwischen client und server, und wenn dieser die methoden des webservices nicht kennen würde, dann könntest du die nicht aufrufen

so ungefähr, aber des macht für mich schon sinn, dass er ein objekt anlegt, dass die methoden des webservices aufruft, 

dadurch wirds einfacher und du musst dich nicht mehr um die verbindung kümmern 

mfg


----------



## Proko (23. Mai 2007)

winniwinter hat gesagt.:


> ich beschäftige mich ebenfalls mit dem thema webservice,
> 
> Momentan habe ich probleme meine Ausgabe dem Client zukommen zulassen. Bevor ich überhaupt noch weiter mache, könnte sich jmd meinen Code mal angucken, da ich nicht der überprofi in Java bin.
> 
> ...



also, ansich ist der code okay glaube ich, aber ein PDF in awt.desktop packen?
bei den webservices wird ja der datentyp in der WSDL beschrieben, hast du dir da schon mal spezifikationen angeschaut?

so auf die schnelle habe ich mal gefunden:
Webservices : unterstützte datentypen:
boolean, byte, short, int, long, float, double, die Wrapper Klassen Boolean, Integer, Double....
Arrays, div. Listen, Bäume etc
String, Date, Calendar, bigDecimal, BigInteger
Holder klassen
bei eigenen komplexen Klassen werden nur properties (setter+getter) serialisiert


vlt. gibt es ja die möglichkeit ein PDF in ein file zu wrappen und das zu serialisieren und rumschicken

falls es geht wird das sehr unperformant sein, würde ich nicht mit einem webservice machen

mfg


----------



## cipher (24. Mai 2007)

Proko hat gesagt.:


> wenn du einen webservice erstellst z.bsp. in C# sieht das ja so aus...
> [Webservice...]
> class Service  : System.Web.Services.WebService {
> [WebMethod]
> ...




Danke für die schnelle Antwort.

Mir ist schon klar, wie die Web Services im Prinzip funktionieren. Mein Problem liegt in den Zeilen

_Service service = Service.create(new URL("http://localhost:44444/Calculator?wsdl"), new QName("http://tutorials.de/", "Calculator"));

ICalculator simpleService = service.getPort(ICalculator.class);_

des obigen Beispiels. Die Generierung des Services mit Hilfe der WSDL URL sowie Servicename und Domain ist klar. Aber 

_ICalculator simpleService = service.getPort(ICalculator.class)_ 

setzt doch die Kenntnis des Clients bezüglich des im Server beschriebenen Interfaces voraus, die WSDL-Beschreibung reicht da wohl nicht (die Methode aktzeptiert auch nur eine Interfacebeschreibung soweit ich weiss).
Wenn ich nun einen Webservice unter .NET implementiert habe, muss ich meinem Java Client ebenfalls dieses Interace bekannt machen ? (Oder ist der obige Code irgendwo nicht vollständig?)

mfg


----------



## Thomas Darimont (24. Mai 2007)

Hallo,

das Interface auf Clientseite zu haben ist sehr sinnvoll, da du so getyped mit dem WebService interagieren kannst. Außerdem kannst du dann auch die Remoting-Implementierung Transparent halten (vielleicht willst du irgendwann mal, dass du RMI statt Webservices verwendest..., wenn du dann die entsprechenden Service Interfaces verwendet hast brauchst du hier keinen Code zu verändern) Wenn du den oben definierten Webservice über .Net ansprichst wird dir auch ein entsprechendes Client interface generiert... hier liefere ich dieses der Einfachheit halber jedoch mit, um den Schritt auf Java Client Seite ein zusätzliches Interface generieren zu müssen einzusparen.)

Gruß Tom


----------



## cipher (24. Mai 2007)

Hallo, vielen Dank.

Dann muss ich nur noch herausfinden, wo das entsprechende Interface generiert wird. Ich habe die entsprechenden Web Services bereits mit statisch generierten Stubs zum laufen gebracht - war kein Problem, hier bekomme ich ja das Interface - aber bei den dynamisch generierten sehe ich das einfach nicht (finde auch keine adequaten Beispiele im Netz).

mfg


----------



## Thomas Darimont (24. Mai 2007)

Hallo,

so kannst du dir aus einem WSDL Dokument einen Client generieren lassen (Beispiel unter Java 6):

```
D:\tmp\ws>mkdir generated
D:\tmp\ws>mkdir source

D:\tmp\ws>wsimport -d generated -s source http://localhost:44444/Calculator?wsdl
```

Ergebnis in generated:

```
package de.tutorials;

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


/**
 * This class was generated by the JAXWS SI.
 * JAX-WS RI 2.0_02-b08-fcs
 * Generated source version: 2.0
 * 
 */
@WebService(name = "ICalculator", targetNamespace = "http://tutorials.de/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface ICalculator {


    /**
     * 
     * @param arg1
     * @param arg0
     * @return
     *     returns int
     */
    @WebMethod
    @WebResult(partName = "return")
    public int computeSumOf(
        @WebParam(name = "arg0", partName = "arg0")
        int arg0,
        @WebParam(name = "arg1", partName = "arg1")
        int arg1);

}
```


```
package de.tutorials;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;


/**
 * This class was generated by the JAXWS SI.
 * JAX-WS RI 2.0_02-b08-fcs
 * Generated source version: 2.0
 * 
 */
@WebServiceClient(name = "Calculator", targetNamespace = "http://tutorials.de/", wsdlLocation = "http://localhost:44444/Calculator?wsdl")
public class Calculator
    extends Service
{

    private final static URL CALCULATOR_WSDL_LOCATION;

    static {
        URL url = null;
        try {
            url = new URL("http://localhost:44444/Calculator?wsdl");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        CALCULATOR_WSDL_LOCATION = url;
    }

    public Calculator(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public Calculator() {
        super(CALCULATOR_WSDL_LOCATION, new QName("http://tutorials.de/", "Calculator"));
    }

    /**
     * 
     * @return
     *     returns ICalculator
     */
    @WebEndpoint(name = "Calculator")
    public ICalculator getCalculator() {
        return (ICalculator)super.getPort(new QName("http://tutorials.de/", "Calculator"), ICalculator.class);
    }

}
```


Gruß Tom


----------



## winniwinter (24. Mai 2007)

Proko hat gesagt.:


> also, ansich ist der code okay glaube ich, aber ein PDF in awt.desktop packen?
> bei den webservices wird ja der datentyp in der WSDL beschrieben, hast du dir da schon mal spezifikationen angeschaut?
> 
> so auf die schnelle habe ich mal gefunden:
> ...



Naja so umständlich muss es ja gar nicht werden. Meine Überlegung geht in die richtung:


```
public void pdfOeffnen()
	{
		  BufferedOutputStream out = null;
		  BufferedInputStream in = null;
		  try
		  {
			  URL myurl = new URL("http://10.100.0.27/pdf/1.pdf");
			  URLConnection conn = myurl.openConnection();
			  System.out.println(conn.getContentType());
			  
			  in = new BufferedInputStream(conn.getInputStream());
			  
			  out = new BufferedOutputStream(out);
			  byte[] buff = new byte[2048];
			    int bytesRead; 
			    // Simple read/write loop.
			    while(-1 != (bytesRead = in.read(buff, 0, buff.length))) 
			    {		    	
		           out.write(buff, 0, bytesRead);		            
		        }
		    } 
		  
		  catch(final MalformedURLException e) 
		  	{
		        System.out.println ( "MalformedURLException." );
		    } 

		  catch(final IOException e) 
		  	{		  
		        System.out.println ( "IOException." );
		    }
		   finally
		   {
			   out.close();
                                                   in.close();

			   
		   }
		 
	  }
```

So sollte es mir doch auch möglich sein, dem client das PDF anzeigen zu lassen oder?


----------



## zerix (24. Mai 2007)

Hallo,

ist es nicht möglich, dass du die Daten für das PDF in XML zum Client schickst und dort das PDF generierst? Dann hättest du nicht so viel Traffic.


MFG

zEriX


----------



## winniwinter (24. Mai 2007)

nein, denn der User soll das pdf im Browser angezeigt werden. Auf der Client Seite soll lediglich die AngebotsNummer eingegeben werden. Die Verarbeitung soll komplett auf dem Server stattfinden


----------



## Proko (24. Mai 2007)

was wäre wenn du eine HTML seite erzeugst (die kann ja ein reines textdokument sein mit tags und text) mit dem inhalt den du herzeigen willst

und diesen StringBuffer dann dem client schicken, dieser braucht dann nur mehr den browser öffnen

des mit dem pdf hinundherschicken wird echt schwierig denke ich

mfg


----------



## cipher (29. Mai 2007)

Hallo, 
dachte ich mir dass der Client-Stub in diesem Fall nur über iwcompile statsich generiert werden kann. So weit läuft ja auch alles. 

Was mich noch brennend interessieren würde ist die Frage, ob Java Mustang auch WSE beherscht oder ob hierfür J2EE die bessere Wahl ist. Gibt es zum Thema Java und WSE brauchbare Tutorials und Beispiele im Web ?

mfg
Roman


----------



## winniwinter (29. Mai 2007)

so habe nun ein servlet zwischen  benutzer und web service geschalten.
läuft einwandfrei.

der benutzer sendet eine angebotsnummer, die angebotsnummer wird vom servlet entgegengenommen, welches eine verbindung zum webservice herstellt und die angebotsnummer übergibt. 
als antwort erhält das servlet einen string, der den pfad mit der erstellten pdf enthält.
das servlet kann nun die pdf dem benutzer streamen.

habe ich dadurch die WebService-Architektur verfehlt?

Meines wissens glaube ich das nicht, möchte es jedoch von experten nochmal hören


----------



## smuehlba (4. Juni 2007)

Hallo,

das WebService-Beispiel für Java 6 ist wirklich sehr gut...

Ich hab aber das Problem, dass ich weiterhin Java 5 verwenden muss.
Hab versucht, im Forum ein Bsp. für Java 5 zu finden, die Suche war aber leider erfolglos.

Kann mir vielleicht jemand erklären, wie ich den WebService unter Java 5 machen kann?

Danke schon mal...

mfg
smuehlba


----------



## Thomas Darimont (4. Juni 2007)

Hallo,

schau mal hier:
http://www.tutorials.de/forum/java/236622-webservices-mit-spring-und-axis.html
http://www.tutorials.de/forum/java/240075-flotte-webservices-mit-xfire.html
http://www.tutorials.de/forum/java/183852-web-services-mit-axis.html


Hier noch ein cooles tutorial zu Asynchronen Webservice aufrufen (man ruft den Service auf und ruft das Ergebnis später ab und oder benutzt Callbacks)
http://today.java.net/pub/a/today/2006/09/19/asynchronous-jax-ws-web-services.html

Gruß Tom


----------



## smuehlba (5. Juni 2007)

Danke für die schnelle Hilfe...

Aber nochmal zum Java 6 Beispiel: habs getestet und wenn ich im Client einen neuen Service generiere, bekomme ich folgenden Fehler:


> javax.xml.ws.WebServiceException: javax.xml.ws.WebServiceException: Unable to createEndpointReference Provider: Failed to load javax.xml.ws.spi.Provider: org.jboss.ws.core.jaxws.spi.ProviderImpl
> at javax.xml.ws.Service.create(Service.java:731)
> at com.kontron.fctestclient.Main.main(Main.java:33)
> Caused by: javax.xml.ws.WebServiceException: Unable to createEndpointReference Provider: Failed to load javax.xml.ws.spi.Provider: org.jboss.ws.core.jaxws.spi.ProviderImpl
> ...



Hab schon versucht, die Libraries zu tauschen, bringt aber nichts...

mfg 
smuehlba


----------



## smuehlba (6. Juni 2007)

Hi,

das Problem hat sich von alleine erledigt! Hab aber bis jetzt keinen blassen Schimmer, wieso?

Gibt es eine Möglichkeit, dem WebService mitzuteilen, dass er bestimmte Attribute nicht übergeben soll? Ich habe das Problem bei einem EntityBean mit einer OneToMany-Beziehung, die auf FetchType.LAZY ist. Bekomme dann folgerichtig eine LazyInitializationException, weil er versucht, die Objekte mit zu übergeben...

mfg
smuehlba


----------

