Ich hab mir ein EJB3-Minimal-WebService gebaut, wo ich eine Methode ohne Parameter habe:
Code:
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:
Code:
<?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:
Code:
<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:

Code:
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:
Code:
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:
Code:
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.getDispatchDestination(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.processSOAPRequest(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.service(StandardEndpointServlet.java:76)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(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.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(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.