Seltsames Problem mit glassfish: WebService-Client scheint überladenes toString() nicht zu kennen



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/
.



Relevant Pages

  • Re: WideString leeren
    ... Wenn es ein Web Service ist, kommt es auf den verwendeten Client an. ... Bei Delphi's SOAP Implementierung kann man in der Konfiguration der THTTPRio Komponente soDontSendEmptyNodes = true verwenden. ... In der Newsgroup borland.public.delphi.webservices.soap werden Fragen zu Web Services jedoch recht schnell beantwortet. ...
    (de.comp.lang.delphi.misc)
  • Assmebly.Load error using Byte()
    ... I have 2 WebApplication project (dummy and dummy2). ... The first is trying to load a UserControl compiled in the second. ... The web sites are formed of a client part and an administration part. ... An unhandled exception occurred during compilation using ...
    (microsoft.public.dotnet.framework.aspnet)
  • http Upload
    ... Auf einem Windows 2003 (Web Edition ohne Active Directory) IIS 6 kann ich ... Ist das nun schon Sharepoint, oder wäre Sharepoint eine zu installierende dritte Webdiensterweiterung? ... Als Client sollen die Betriuebssysteme ... Welcher Client kann auf welche Webdiensterweiterung zugreifen, ...
    (microsoft.public.de.inetserver.iis)
  • Proxy Objekte in Web Services und EJB
    ... Da bin ich mir nun nicht sicher: gibt es bei Java die Möglichkeit, bei einem per Web Service - Aufruf erhaltenem Objekt auch Methoden aufzurufen (auf dem Client), die dann remote etwas bewirken? ... BankService s = new BankService; ... // bewirkt etwas auf dem Server? ... Oder sind die bei Web Services ausgetauschten Objekte reine 'Data Transfer' Objekte? ...
    (de.comp.lang.java)
  • Re: Tabelle mit Seitenumbruch zum Ausdruck erstellen
    ... das größtenteils nur im Client selbst anpassen kann, ...
    (microsoft.public.de.german.entwickler.dotnet.asp)