Seltsames Problem mit glassfish: WebService-Client scheint überladenes toString() nicht zu kennen
- From: Erhard Schwenk <eschwenk@xxxxxx>
- Date: Wed, 02 Jan 2008 20:41:03 +0100
Hallo,
ich hab da ein seltsames Problem mit einem EJB-basierten Webservice.
a) Umgebung:
- PostgreSQL Datenbankserver
- Netbeans 6.0 mit mitgeliefertem Glassfish 2.0
eschwenk@es:~$ java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
b) Problemstellung:
Endziel des Ganzen ist eine Anwendung, bei der ein über Web Start verteilter Client auf Web Services zugreift, die auf dem Glassfish laufen. Diese sollen auf ein EJB-Modul zugreifen, das dann seinerseits über den Persistence Layer die Datenbank ansteuert.
Später wird die Anwendung natürlich größer, aber erstmal solls ein Architektur-Test zum Eingewöhnen mit einer einfachen Tabelle werden.
c) Vorgehensweise:
1. Erzeugen einer simplen Tabelle in der Datenbank:
CREATE TABLE dummy ( id serial primary key, x varchar );
2. Erzeugen eines neuen EJB-Moduls in der Netbeans IDE
3. im EJB-Modul wurde mit Hilfe der IDE eine Entity Class "Dummy" aus der Tabelle erzeugt. Dummy.toString() wurde wie folgt überladen:
@Override
public String toString() {
return id + "/" + x;
}
Der Rest der Session Class ist unspektakulär.
4. Nun wurde - ebenfalls mit Hilfe der IDE - ein Session Bean mit LocalInterface aus der Entity Class erzeugt.
5. Als nächstes wurde ein neues "Enterprise Application" Projekt erzeugt und das EJB-Modul zu diesem Projekt hinzugefügt.
6. Anschließend wurde innerhalb der Enterprise Application eine neue Web Application erzeugt. Innerhalb dieser wurde - ebenfalls über den Netbeans-Wizard - ein Web Service "TestService" erzeugt, der wie folgt aussieht:
package test;
import de.akkordeonjugend.lmtdb.test.Dummy;
import de.akkordeonjugend.lmtdb.test.DummyFacadeLocal;
import java.util.List;
import javax.ejb.EJB;
import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService()
public class TestService {
@EJB
private DummyFacadeLocal ejbRef;
// Add business logic below. (Right-click in editor and choose
// "Web Service > Add Operation"
@WebMethod(operationName = "create")
@Oneway
public void create(Dummy dummy) {
ejbRef.create(dummy);
}
@WebMethod(operationName = "edit")
@Oneway
public void edit(Dummy dummy) {
ejbRef.edit(dummy);
}
@WebMethod(operationName = "remove")
@Oneway
public void remove(Dummy dummy) {
ejbRef.remove(dummy);
}
@WebMethod(operationName = "find")
public Dummy find(Object id) {
return ejbRef.find(id);
}
@WebMethod(operationName = "findAll")
public List<Dummy> findAll() {
return ejbRef.findAll();
}
@WebMethod(operationName = "findAllString")
public String findAllString() {
StringBuffer b = new StringBuffer();
List<Dummy> list = ejbRef.findAll();
for (Dummy dummy : list) {
b.append(dummy.toString() + "\n");
}
return b.toString();
}
}
Dieser Webservice wurde erstmal auf den Glassfish deployed und dort über die integrierte Test-Funktion ausprobiert. Sowohl "findAll" als auch "findAllString" liefern dabei die erwarteten Ergebnisse.
7. Schließlich wurde in der IDE ein "Enterprise Application Client"-Projekt erzeugt und darin ein "Web Service Client" auf den dargestellten Web Service.
8. Innerhalb des Client-Projekts wurde dann eine Main-Klasse erzeugt. Diese sieht so aus:
package applicationclient4;
import javax.xml.ws.WebServiceRef;
import test.TestServiceService;
public class Main {
@WebServiceRef(wsdlLocation =
"http://localhost:8139/lmt-war/TestServiceService?wsdl")
private static TestServiceService service;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
try { // Call Web Service Operation
test.TestService port = service.getTestServicePort();
// TODO process result here
java.util.List<test.Dummy> result = port.findAll();
int i=0;
for (test.Dummy d: result) {
i++;
System.out.println(i + ": " + d.getId() + "/" + d.getX() + "(" + d.toString() + ")");
}
String s = port.findAllString();
System.out.println("Result String:\n"+s);
} catch (Exception ex) {
// TODO handle custom exceptions here
}
}
}
So, und jetzt kommt mein Problem. Der Output wenn man den Client startet sieht wie folgt aus:
1: 1/"test"(test.Dummy@e1469c)
2: 2/xxx(test.Dummy@1e2bda7)
Result String:
1/"test"
2/xxx
Das heißt, es sieht so aus, als ob test.Dummy.toString() wenn es vom Client aus aufgerufen wird auf Object.toString() gebunden wird. Wird hingegen Dummy.toString() schon im Web Service aufgerufen, erscheint korrekt das überladene Ergebnis.
Und da bin ich nun etwas ratlos. Bug? Feature? Verständnisfehler?
--
Erhard Schwenk
Akkordeonjugend Baden-Württemberg - http://www.akkordeonjugend.de/
APAYA running System - http://www.apaya.net/
.
- Follow-Ups:
- Re: Seltsames Problem mit glassfish: WebService-Client scheint überladenes toString() nicht zu kennen
- From: Andreas Wollschlaeger
- Re: Seltsames Problem mit glassfish: WebService-Client scheint überladenes toString() nicht zu kennen
- Prev by Date: eclipse problem unter (SuSE) linux
- Next by Date: Re: LiveUpdate mit Java?
- Previous by thread: eclipse problem unter (SuSE) linux
- Next by thread: Re: Seltsames Problem mit glassfish: WebService-Client scheint überladenes toString() nicht zu kennen
- Index(es):
Relevant Pages
|