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:
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">
<soapperation 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">
<soapperation 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.
und hier:
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
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">
<soapperation 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">
<soapperation 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