Wrapperklasse mit jax-ws2

kirchrath

Mitglied
Ich möchte zuerst anmerken, dass ich mich erst sehr kurz mit Webservices beschäftige und es daher sehr gut sein kann, dass meine Frage eher trivial ist. Ich versuchte anhand der Java Insel einen Webservice zu implementieren. Leider schlägt mein aktueller Versuch jedoch fehl. Als Rückgabe einer Methode habe ich keine elementaren Datentyp angegeben sondern eine Wrapperklasse. Irgendwie hat die über wsimport erzeugte Klasse keine der vorherigen Methoden.

Es wäre echt schön, wenn mit jemand behilflich sein könnte.
Hier sind meine Klassen:
Main.java
Java:
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.swing.JOptionPane;
import javax.xml.ws.Endpoint;

@WebService

@SOAPBinding(style=Style.RPC)
public class Main {
	@WebMethod
	public Wrapper get()
	{
		return new Wrapper(123);
	}
	public static void main(String args[])
	{
		Main server = new Main();
        Endpoint endpoint = Endpoint.publish("http://localhost:7001/test", server);
         JOptionPane.showMessageDialog(null, "Shutdown TestServer");
         endpoint.stop();
	}
}

und die Wrapperklasse Wrapper.java
Java:
import javax.jws.WebMethod;

public class Wrapper {
	private int data = 0;
	Wrapper (){}
	
	Wrapper (int i){
		data = i;
	}

	@WebMethod
	public int get()
	{
		return data;
	}
}
 

eRaaaa

Top Contributor
Sieht eig. ganz okay aus

>>Irgendwie hat die über wsimport erzeugte Klasse keine der vorherigen Methoden.

Auf welche Klasse beziehst du dich da? Wurden bei dir nicht mehrere generiert? Unter anderem ein Interface? Dort sollte die besagte get-Methode eig. enthalten sein.
 

kirchrath

Mitglied
Danke für die Antwort.

Generiert wurden mir Klassen über wsimport -keep http://localhost:7001/test?wsdl. Dabei sind folgende Klassen erstellt worden:
Main.class
MainService.class
ObjectFactory.class
package-info.class
Wrapper.class

In meiner Testklasse wollte ich auf die Daten im Wrapper zugreifen - das versuchte ich so:
Java:
public class Test {
	public static void main(String args[]) {
	        MainService service = new MainService();
	        Main m = service.getMainPort();
	        Wrapper w = m.get();
	    }
}
Die klasse Wrapper hat auf der Serverseite eine Methode get (nicht die von Main) die mir den Inhalt ausgeben soll. In der durch wsdlimport erzeugten Klasse gibt es diese Methode aber nicht.
 

eRaaaa

Top Contributor
Ahhhh okay, verstehe!(denke ich zumindest)
Versuchs mal so:
Java:
public class Wrapper {
	private int data = 0;

	Wrapper() {
	}

	Wrapper(int i) {
		data = i;
	}

	public int getData() {
		return data;
	}
	public void setData(int d) {
		this.data = d;
	}
}
getter+setter !
Die Annotation in der Wrapper-Klasse kannst du auch weglassen, da diese ja gar kein WebService ist :)
 

kirchrath

Mitglied
Ich verstehe jetzt zwar nicht wieso das so jetzt funktioniert und die andere Variante nicht - aber es geht - und darauf kommt es ja nur drauf an :-D

Vielen vielen Dank!
 
G

Gast2

Gast
Ich verstehe jetzt zwar nicht wieso das so jetzt funktioniert und die andere Variante nicht

Das ist ganz einfach. Das JAXB-Binding findet automatisch statt und geht davon aus, XmlElemente nur für Variablen zu erstellen, für die es Getter UND Setter gibt. Das kannst Du mit manuellem Binding übersteuern, indem Du in Deinem Code der get()-Methode die Notation
Java:
@XmlElement(name = "data")

voranstellst. Dafür offerierst Du aber clientseitig eine Set-Methode, die es serverseitig nicht gibt. Die Werte werden dann theoretisch verworfen, solltest Du ein solches Objekt mal hochpushen.
 

Neue Themen


Oben