WebService innerhalb von Seam-Projekt, komplexe Datentypen

thommy.s

Aktives Mitglied
Hallo alle miteinander,

in einem Seam-Projekt möchte ich Ergebnisse von Datenbankabfragen in einer ArrayList verpackt von einem WebService seinen Klienten übergeben.

Code der Bean-Klasse auf Service-Seite hier:

Java:
/**
 * 
 */
package blabla.netpoint;

import java.util.ArrayList;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.medfak.thommys.CFL.model.pdfplan.ScheduleValues;



@Stateless
@WebService
@SOAPBinding(style = Style.RPC)
@Name("net")
public class ReturnResultListsBean implements ReturnResultListsRemote {
	
	private String str1;
	
	@PersistenceContext
	private EntityManager em;
	
	@DataModel
	private ArrayList<ScheduleValues> rsList;
	
	@WebMethod(operationName = "getString")
	public String getStr1() {
		
		
		str1 = "I'm a great RemoteString";

		return str1;
	}
	
	@SuppressWarnings("unchecked")
	@WebMethod(operationName = "getResult")
	//@Factory("rsList")
	public ArrayList<ScheduleValues> getStundenplanResult(Integer studiengangId, Integer persgroupId, Integer kategorieId, Integer studienjahrId, Integer modulId, Integer einrichtungId) {
		
		rsList = (ArrayList<ScheduleValues>) em.createQuery("select r.dtxt from Raum r").getResultList();
		
		System.out.println("Die Anfrage ist hier angekommen");
		
		return rsList;
		
	}

}

die zugehörige WSDL-Datei (die automatisch erzeugt wird), hier:

[XML]

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="ReturnResultListsBeanService" targetNamespace="http://netpoint.action.CFL.thommys.medfak.org/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://netpoint.action.CFL.thommys.medfak.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types>
<xs:schema targetNamespace="http://netpoint.action.CFL.thommys.medfak.org/" version="1.0" xmlns:tns="http://netpoint.action.CFL.thommys.medfak.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="arrayList">
<xs:complexContent>
<xs:extension base="tns:abstractList">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractList">
<xs:complexContent>
<xs:extension base="tns:abstractCollection">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractCollection">
<xs:sequence/>
</xs:complexType>
</xs:schema>
</types>
<message name="ReturnResultListsBean_getString">
</message>
<message name="ReturnResultListsBean_getResultResponse">
<part name="return" type="tns:arrayList">
</part>
</message>
<message name="ReturnResultListsBean_getResult">
<part name="arg0" type="xsd:int">
</part>
<part name="arg1" type="xsd:int">
</part>
<part name="arg2" type="xsd:int">
</part>
<part name="arg3" type="xsd:int">
</part>
<part name="arg4" type="xsd:int">
</part>
<part name="arg5" type="xsd:int">
</part>
</message>
<message name="ReturnResultListsBean_getStringResponse">
<part name="return" type="xsd:string">
</part>
</message>
<portType name="ReturnResultListsBean">
<operation name="getResult" parameterOrder="arg0 arg1 arg2 arg3 arg4 arg5">
<input message="tns:ReturnResultListsBean_getResult">
</input>
<output message="tns:ReturnResultListsBean_getResultResponse">
</output>
</operation>
<operation name="getString">
<input message="tns:ReturnResultListsBean_getString">
</input>
<output message="tns:ReturnResultListsBean_getStringResponse">
</output>
</operation>
</portType>
<binding name="ReturnResultListsBeanBinding" type="tns:ReturnResultListsBean">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getResult">
<soap:eek:peration soapAction=""/>
<input>
<soap:body use="literal" namespace="http://netpoint.action.CFL.thommys.medfak.org/"/>
</input>
<output>
<soap:body use="literal" namespace="http://netpoint.action.CFL.thommys.medfak.org/"/>
</output>
</operation>
<operation name="getString">
<soap:eek:peration soapAction=""/>
<input>
<soap:body use="literal" namespace="http://netpoint.action.CFL.thommys.medfak.org/"/>
</input>
<output>
<soap:body use="literal" namespace="http://netpoint.action.CFL.thommys.medfak.org/"/>
</output>
</operation>
</binding>
<service name="ReturnResultListsBeanService">
<port name="ReturnResultListsBeanPort" binding="tns:ReturnResultListsBeanBinding">
<soap:address location="http://alterego:8080/CFL-CFL/ReturnResultListsBean"/>
</port>
</service>
</definitions>[/XML]

Un nun noch die wichtigst Klienten-Klassen. Übrigens ebenfalls automatisch erzeugt, diesmal durch wsimport.

Java:
package org.medfak.thommys.pdfplan.session.netpoint;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebServiceClient(name = "ReturnResultListsBeanService", targetNamespace = "http://netpoint.action.CFL.thommys.medfak.org/", wsdlLocation = "http://g05schmidt:8080/CFL-CFL/ReturnResultListsBean?wsdl")
public class ReturnResultListsBeanService
    extends Service
{

    private final static URL RETURNRESULTLISTSBEANSERVICE_WSDL_LOCATION;
    private final static Logger logger = Logger.getLogger(org.medfak.thommys.pdfplan.session.netpoint.ReturnResultListsBeanService.class.getName());

//    static {
//        URL url = null;
//        try {
//            URL baseUrl;
//            baseUrl = org.medfak.thommys.pdfplan.session.netpoint.ReturnResultListsBeanService.class.getResource(".");
//            url = new URL(baseUrl, "http://g05schmidt:8080/CFL-CFL/ReturnResultListsBean?wsdl");
//        } catch (MalformedURLException e) {
//            logger.warning("Failed to create URL for the wsdl Location: 'http://g05schmidt:8080/CFL-CFL/ReturnResultListsBean?wsdl', retrying as a local file");
//            logger.warning(e.getMessage());
//        }
//        RETURNRESULTLISTSBEANSERVICE_WSDL_LOCATION = url;
//    }
    
	  static {
	  URL url = null;
	  try {
	      URL baseUrl;
	      baseUrl = org.medfak.thommys.pdfplan.session.netpoint.ReturnResultListsBeanService.class.getResource(".");
	      url = new URL(baseUrl, "http://alterego:8080/CFL-CFL/ReturnResultListsBean?wsdl");
	  } catch (MalformedURLException e) {
	      logger.warning("Failed to create URL for the wsdl Location: 'http://alterego:8080/CFL-CFL/ReturnResultListsBean?wsdl', retrying as a local file");
	      logger.warning(e.getMessage());
	  }
	  RETURNRESULTLISTSBEANSERVICE_WSDL_LOCATION = url;
	}

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

    public ReturnResultListsBeanService() {
        super(RETURNRESULTLISTSBEANSERVICE_WSDL_LOCATION, new QName("http://netpoint.action.CFL.thommys.medfak.org/", "ReturnResultListsBeanService"));
    }

    /**
     * 
     * @return
     *     returns ReturnResultListsBean
     */
    @WebEndpoint(name = "ReturnResultListsBeanPort")
    public ReturnResultListsBean getReturnResultListsBeanPort() {
        return super.getPort(new QName("http://netpoint.action.CFL.thommys.medfak.org/", "ReturnResultListsBeanPort"), ReturnResultListsBean.class);
    }

    /**
     * 
     * @param features
     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns ReturnResultListsBean
     */
    @WebEndpoint(name = "ReturnResultListsBeanPort")
    public ReturnResultListsBean getReturnResultListsBeanPort(WebServiceFeature... features) {
        return super.getPort(new QName("http://netpoint.action.CFL.thommys.medfak.org/", "ReturnResultListsBeanPort"), ReturnResultListsBean.class, features);
    }

}

und hier:

Java:
package org.medfak.thommys.pdfplan.session.netpoint;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.bind.annotation.XmlSeeAlso;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "ReturnResultListsBean", targetNamespace = "http://netpoint.action.CFL.thommys.medfak.org/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@XmlSeeAlso({
    ObjectFactory.class
})
public interface ReturnResultListsBean {


    /**
     * 
     * @param arg5
     * @param arg4
     * @param arg3
     * @param arg2
     * @param arg1
     * @param arg0
     * @return
     *     returns org.medfak.thommys.cfl.action.netpoint.ArrayList
     */
    @WebMethod
    @WebResult(partName = "return")
    public ArrayList getResult(
        @WebParam(name = "arg0", partName = "arg0")
        Integer arg0,
        @WebParam(name = "arg1", partName = "arg1")
        Integer arg1,
        @WebParam(name = "arg2", partName = "arg2")
        Integer arg2,
        @WebParam(name = "arg3", partName = "arg3")
        Integer arg3,
        @WebParam(name = "arg4", partName = "arg4")
        Integer arg4,
        @WebParam(name = "arg5", partName = "arg5")
        Integer arg5);

    /**
     * 
     * @return
     *     returns java.lang.String
     */
    @WebMethod
    @WebResult(partName = "return")
    public String getString();

}

Problem ist nun, dass ich eben eine abstrakte ArrayList zurückbekomme, die nur noch die Eigenschaften und Methoden wie java.lang.Object hat. Das Problem habe ich auch schon mehrfach gefunden, nur eben keine zielführende Lösung. Meine Vermutung ist, dass es am Serialisieren und Deserialisieren liegt. Eine weitere Vermutung ist, dass das irgendwie in der WSDL-Datei auch vermerkt sein muss. Da die aber jedem JBoss-Neustart ebenfalls neu erstellt wird, werde ich es der Service-Klasse mit irgendwelchen Annotationen sagen müssen.
Arbeite mich gerade erst in das Thema ein und bin deshalb nun ein wenig verwirrt, was zu tun wäre.
Würde mich deshalb freuen, wenn sich eine(r) mal erbarmt und mir das mal erklärt.

Viele Grüße

Thomas
 
G

gman

Gast
Hi,

ich habe sowas kürzlich auch mal gemacht. Ich glaube das Problem ist der Rückgabewert von "getStundenplanResult".
Wenn dein "ScheduleValues" ein einfaches POJO mit XML-Annotationen ist, kannst du den Rückgabewert auf
Code:
ScheduleValues[]
ändern. Dann sollte dein Webservice ein Array von XML-Dokumenten zurück geben.
 

thommy.s

Aktives Mitglied
@gman

Das war ein guter Hinweis. Damit bin ich einen Schritt weitergekommen. Jetzt gibt es allerdings immer noch ein Problem. Wenn die Anfrage auf der Serverseite aufschlägt, gibt es einen Nullpointer, da nicht immer alle Parameter (insgesamt 6 vom Typ Integer, siehe oben) gefüllt sind. in der WSDL sehe ich immer z.B.

[XML]
<part name="arg0" type="xsd:int"/>
[/XML]

Es sollte aber eigentlich jeweils ein Objekt der Wrapperklasse Integer sein. Das ist auf Serverseite auch
so geschrieben, wird aber von der WSDL-Generierung insofern ingnoriert, dass es eben immer primitive ints werden. Gibt es hier noch eine Möglichkeit, es so zu beeinflussen, dass der Client Wrapperobjekte mitgibt?


Viele Grüße

Thomas
 
G

gman

Gast
Hmm,

da ich bis jetzt nur die primitiven Datentypen genommen habe ist mir das noch nicht aufgefallen. Kann gut sein das
ein "upcast" auf eine Wrapperklassen so mit Webservices nicht umzusetzen ist. Aber da musste mal nach googeln,
das weiß ich auch nicht so direkt.
 

thommy.s

Aktives Mitglied
...es geht tatsächlich, allerdings kann man die durch 'wsimport' erstellten Interfaces und Stub-Klassen nicht einfach so und ohne weitere Anpassung verwenden. 'wsimport' hat es nicht automatisch erkannt. Zumindest für die kleine getString()-Methode (siehe oben) habe ich es hinbekommen, mit der Wrapperklasse zu arbeiten und so Werte hin- und herzuschieben. Im Log von Jboss taucht als Typ dann tatsächlich 'java.lang.Integer' und nicht mehr 'int' auf.

Für die eigentliche Methode muss ich noch an anderen Problemen basteln, dann wird es hoffentlich auch funktionieren.

Danke dir.

Thomas
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Error beim Versuch, einen Webservice zu kontaktieren SOA 4
J SOA WebService JAX-WS Java-Klasse per wsimport generieren lassen SOA 3
K Webservice: 4 counts of IllegalAnnotationExceptions SOA 0
D Zertifikat Authentifizierung am Webservice SOA 0
P JBOSS 7 und Restful Webservice SOA 1
N WebService Ausgabe einer ArrayList SOA 2
N Web Services Client aus externen WebService erstellen SOA 4
I SOAP Webservice Methoden und Parameter auslesen SOA 3
F [WebService] Array von eigenen Objekten SOA 0
P SOAP Webservice mit HTTP Basic Authentifizierung SOA 1
M JAVA Webservice Währungsrechner DRINGEND Hilfe SOA 1
A Up-/ Download von Dateien zu WebService SOA 6
D WebService Technik - Aufwand Änderung des Application Server SOA 3
R Webservice Timeout Konfiguration SOA 3
D SOAP Webservice (SAP) SOA 3
MQue WebService Versionierung SOA 9
L [AXIS2] OutOfMemory Exception bei Übertragung von größerer Datei via Webservice SOA 3
A Funktion mit Map als WebService SOA 4
T Webservice serviceName im Handler ermitteln SOA 3
N Webservice Einbinden wsdl SOA 7
M Edit und Remove über Webservice SOA 3
F Client Problem gegen Webservice SOA 3
P Java Webservice mit JWS Bindingnamen customizen SOA 4
L wie ArrayList an Webservice geben? SOA 3
B Webservice Config / SoapStub: Best Practice SOA 3
S Objektübertragung Fehler über Webservice SOA 10
E Webservice durch Java ansprechen SOA 7
L Webservice HTTPS Netbeans SOA 2
G NullPointerException bei Parameterübergabe an Webservice mittels kSoap2 SOA 2
M Webservice per URL ansprechen SOA 14
M Webservice Client erstellen und XML Request senden SOA 3
T Verwendung von Eclipse Projekten im Axis2 Webservice SOA 8
S Webservice als "CronJob" SOA 4
M Webservice (JaxWS) extern verfügbar machen SOA 5
M Welches WebService Framework ist denn das beste FRAMEWORK? SOA 5
D Webservice fürs Internet sichtbar machen SOA 2
W WebService aus einer HTML-Seite SOA 9
N JAX-WS WebService und Tomcat 7 SOA 11
E Trennung von Daten und WebService und Wiederverwendung der Daten SOA 2
D Sicherheit bei REST-Webservice SOA 19
G WebService, was darf der Client alles sehen SOA 19
M Nutzen des Webservice AWSECommerceService SOA 1
S AXIS2 Webservice: Umgang mit komplexen Datentypen SOA 5
G Webservice Contract first SOA 8
G WebService -> ServletFilter SOA 2
G WebService Concurrency SOA 19
M Fehler beim Veröffentlichen eines Webservice SOA 6
G WebService Types SOA 7
G OpenLigaDB Webservice Client SOA 4
G WebService WSDL SOA 3
A PHP WebService aus Java aufrufen SOA 2
R Proxy WebService erstellen SOA 3
G JPA/ Webservice: Passwort Feld einer Klasse fürs Lesen "verschleiern" SOA 10
G WebService mit wsdl erstellen SOA 4
P WebService SOA 6
H Webservice: BindingProvider SOA 6
D WebService DB abfrage SOA 4
mabe83 EJB Klassen für Webservice nutzen SOA 2
S Webservice-Client-Klasse gibt immer null zurück SOA 3
G WebService mit komplexen Objekten SOA 5
C Problem mit Java Webservice - SOAPBinding.Style - Wrapper class fehlt SOA 1
T Rest Webservice der 2 verschiedene XML Objekte(JaxB) entgegennimmt SOA 10
S Webservice, Vererbung und Netbeans SOA 3
E Lesen der kompletten SOAP als WebService Provider/Server SOA 4
T WebService Authentifizierung SOA 11
mabe83 Suche Hilfe zum Thema Webservice + EJB SOA 3
T WebService erstellen SOA 28
T Krankes Vorhaben: Von VB auf Java Webservice SOA 10
M Webservice RuntimeModelerException? SOA 5
G Webservice mit Java aufrufen SOA 2
G WebService: mehrere methoden mit demselben Namen SOA 4
T einfacher Webservice SOA 3
G Webservice im JBoss: runtime modeler error SOA 3
V webservice von aussen (webbrowser) ansprechen SOA 2
V Webservice, allgemeine Fragen SOA 9
G Alfresco - WebDav oder WebService SOA 2
0 Webservice nutzen (rpc/enc style) SOA 2
R XML verschicken mit Webservice Server Client SOA 2
R Webservice aufrufen mit SOAP Style.DOCUMENT ? SOA 5
G Webservice zugreifen SOA 6
G Deploy Apache CXF WebService mit Eclipse SOA 2
G Webservice mit JSON SOA 8
T Webservice über Tomcat loggen SOA 5
thE_29 WebService - JAXBElement - richtige Klasse? SOA 2
L Probleme mit komplexen Datentypen in einen Webservice SOA 2
O brauche hilfe bei java/webservice geschichte SOA 29
M Webservice/ Axis/ Bea Weblogic Server 8.1 SOA 12
E Webservice konfigurieren SOA 2
Y Webservice erstellen SOA 4
F Tutorial zu WebService mit JBoss, Eclipse und Jax-ws? SOA 3
C Webservice im Unternehmen SOA 4
L webservice frage (eclipse/wtp, wsdl) SOA 12
U Webservice mit Axis, Hello World Beispiel SOA 2
J Frage zu Webservice SOA 3
L WebService TestClient Problem SOA 2

Ähnliche Java Themen

Neue Themen


Oben