PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : J2EE WebService und .net Client - seltsame Datentypen



ComSubVie
06-12-2006, 08:12
Ich hab mir ein EJB3-Minimal-WebService gebaut, wo ich eine Methode ohne Parameter habe:
package example;

import javax.ejb.*;
import javax.jws.*;
import javax.jws.soap.*;

@WebService
@SOAPBinding( style = SOAPBinding.Style.DOCUMENT )
@Stateless
@Remote( IRandom.class )
public class Random {

@WebMethod
public boolean getRandom() {
if ( Math.random() < 0.5 ) {
return false;
} else {
return true;
}
}
}

Dann wird das ganze mit der folgenden web.xml deployed:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>Random</servlet-name>
<servlet-class>example.Random</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Random</servlet-name>
<url-pattern>/Random</url-pattern>
</servlet-mapping>
</web-app>

Sodass mir der JBoss die folgende WSDL zur Verfügung stellt:
<definitions name='RandomService' targetNamespace='http://example/jaws' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://example/jaws' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<types>
<schema elementFormDefault='qualified' targetNamespace='http://example/jaws' xmlns='http://www.w3.org/2001/XMLSchema' xmlns:soap11-enc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='http://example/jaws' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<complexType name='getRandom'>
<sequence/>
</complexType>
<complexType name='getRandomResponse'>
<sequence>
<element name='result' type='boolean'/>

</sequence>
</complexType>
<element name='getRandom' type='tns:getRandom'/>
<element name='getRandomResponse' type='tns:getRandomResponse'/>
</schema>
</types>
<message name='Random_getRandom'>
<part element='tns:getRandom' name='parameters'/>
</message>

<message name='Random_getRandomResponse'>
<part element='tns:getRandomResponse' name='result'/>
</message>
<portType name='Random'>
<operation name='getRandom'>
<input message='tns:Random_getRandom'/>
<output message='tns:Random_getRandomResponse'/>
</operation>
</portType>

<binding name='RandomBinding' type='tns:Random'>
<soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getRandom'>
<soap:operation soapAction=''/>
<input>
<soap:body use='literal'/>
</input>
<output>
<soap:body use='literal'/>

</output>
</operation>
</binding>
<service name='RandomService'>
<port binding='tns:RandomBinding' name='RandomPort'>
<soap:address location='http://itwien2:8080/random/Random'/>
</port>
</service>
</definitions>

Wenn ich jetzt in Visual Studio (2005 c# express) eine WebReferenz auf das ganze einfüge, kann ich zwar prinzipiell wunderbar damit arbeiten, jedoch will das etwas unlogische Datentypen haben:


getRandom ( getRandom As getRandom ) As getRandomResponse

Wenn ich die WebReferenz darauf z.B. JBossApplication nenne, dann benötige ich den folgenden Code um darauf zuzugreifen:
using System;
using System.Collections.Generic;
using System.Text;

namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
JBossApplication.RandomService service = new JBossApplication.RandomService();
JBossApplication.getRandomResponse response;
response = service.getRandom( new JBossApplication.getRandom() );
System.Console.WriteLine(response.result);

System.Console.WriteLine();
}
}
}

Wenn ich ein service.getRandom( null ) mache, bekomme ich im JBoss eine NoSuchElementException:
08:55:37,070 ERROR [SOAPFaultExceptionHelper] SOAP request exception
java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(AbstractList.java: 427)
at org.jboss.ws.server.ServiceEndpointInvoker.getDisp atchDestination(ServiceEndpointInvoker.java:166)
at org.jboss.ws.server.ServiceEndpointInvoker.invoke( ServiceEndpointInvoker.java:107)
at org.jboss.ws.server.ServiceEndpoint.handleRequest( ServiceEndpoint.java:209)
at org.jboss.ws.server.ServiceEndpointManager.process SOAPRequest(ServiceEndpointManager.java:355)
at org.jboss.ws.server.StandardEndpointServlet.doPost (StandardEndpointServlet.java:115)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:717)
at org.jboss.ws.server.StandardEndpointServlet.servic e(StandardEndpointServlet.java:76)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:810)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doF ilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.SecurityAssociationV alve.invoke(SecurityAssociationValve.java:175)
at org.jboss.web.tomcat.security.JaccContextValve.inv oke(JaccContextValve.java:74)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:105)
at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve .invoke(CachedConnectionValve.java:156)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11 ConnectionHandler.processConnection(Http11BaseProt ocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.process Socket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread .run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:595)

Woran liegt das? Warum muss ich als Parameter und Rückgabe so seltsame Datentypen machen, und nicht so wie es definiert ist? Wenn ich das WebService aus einem Java-Client ansprechen will, verhält es sich wie erwartet, nur in .net ist es etwas seltsam.