Anlaufprobleme mit SOAP

NovaFox

Kitsune
Servus.

Ich soll ein Anmeldesystem für Studenten mit SOAP entwickeln. Bisher lief es ganz gut, doch nun treffe ich auf zwei Probleme, denn die anwedung soll in der lage sein ein Array von Studenten zu empfangen und es dann auszugeben, sowie einzelne Studenten zu suchen. Beides klappt leider noch nicht und ich finde den Fehler nicht, irgendwie.

Hier der Quellcode, was ich bisher habe (Das Ganze wird mittels Swing und AWT programmiert)
Code:
private void seekStudentActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        try { // Call Web Service Operation
            bhtvs2.AnmeldeServer service = new bhtvs2.AnmeldeServer();
            bhtvs2.AnmeldeServerPortType port = service.getAnmeldeServer();
            // TODO initialize WS operation arguments here
            java.lang.String id = "";
            javax.xml.ws.Holder<java.lang.String> name = new javax.xml.ws.Holder<java.lang.String>();
            javax.xml.ws.Holder<java.lang.String> matrikelNummer = new javax.xml.ws.Holder<java.lang.String>();
            javax.xml.ws.Holder<byte[]> image = new javax.xml.ws.Holder<byte[]>();
            javax.xml.ws.Holder<Integer> group = new javax.xml.ws.Holder<Integer>();
            javax.xml.ws.Holder<Integer> status = new javax.xml.ws.Holder<Integer>();
            port.getStudent(id, name, matrikelNummer, image, group, status);
            System.out.println("Test: " + name);
        } catch (Exception ex) {
            // TODO handle custom exceptions here
            ex.printStackTrace();
        }
 
    }                                           
 
    private void showAllActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        try { // Call Web Service Operation
            bhtvs2.AnmeldeServer service = new bhtvs2.AnmeldeServer();
            bhtvs2.AnmeldeServerPortType port = service.getAnmeldeServer();
            // TODO process result here
            bhtvs2.ArrayOfnsStudent result = port.listStudents();
            //bhtvs2.
            System.out.println("Result = " + result.getAny().size());
            System.out.println("Result = " + result.getArrayType().toString());
            System.out.println("Result = " + result.getClass());
            System.out.println("Result = " + result);
        } catch (Exception ex) {
            // TODO handle custom exceptions here
            ex.printStackTrace();
        }

Die Klasse ArrayOfnsStudent ist folgendermaßen definiert:

Code:
public class ArrayOfnsStudent extends Array
 
Java class for ArrayOfns__Student complex type.
The following schema fragment specifies the expected content contained within this class.
 <complexType name="ArrayOfns__Student">
   <complexContent>
     <restriction base="{http://schemas.xmlsoap.org/soap/encoding/}Array">
       <attribute ref="{http://schemas.xmlsoap.org/soap/encoding/}arrayType"/>
     </restriction>
   </complexContent>
 </complexType>

Und hier der Quellcode des dazugehörigen WSDL Files.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="anmeldeServer"
 targetNamespace="urn:bhtvs2"
 xmlns:tns="urn:bhtvs2"
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:ns="urn:bhtvs2"
 xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/"
 xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/"
 xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
 xmlns="http://schemas.xmlsoap.org/wsdl/">
 
<types>
 
 <schema targetNamespace="urn:bhtvs2"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:ns="urn:bhtvs2"
  xmlns="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="unqualified"
  attributeFormDefault="unqualified">
  <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
 
  <complexType name="ArrayOfns__Student">
   <complexContent>
    <restriction base="SOAP-ENC:Array">
     <attribute ref="SOAP-ENC:arrayType" WSDL:arrayType="ns:Student[]"/>
    </restriction>
   </complexContent>
  </complexType>
 
<complexType name="Student">
<sequence>
 <element name="name" type="string"/>
 <element name="matrikelNummer" type="string"/>
 <element name="image" type="xsd:base64Binary"/>
 <element name="group" type="xsd:int"/>
 <element name="status" type="int"/>
</sequence>
</complexType>
 
 </schema>
 
</types>
 
<message name="getVersionRequest"/>
 
<message name="getVersionResponse">
 <part name="result" type="xsd:string"/>
</message>
 
<message name="addStudentRequest">
 <part name="student" type="ns:Student"/>
</message>
 
<message name="addStudentResponse">
 <part name="result" type="xsd:int"/>
</message>
 
<message name="getStudent">
 <part name="id" type="xsd:string"/>
</message>
 
<message name="Student">
 <part name="name" type="xsd:string"/>
 <part name="matrikelNummer" type="xsd:string"/>
 <part name="image" type="xsd:base64Binary"/>
 <part name="group" type="xsd:int"/>
 <part name="status" type="xsd:int"/>
</message>
 
<message name="listStudentsRequest"/>
<message name="listStudentsResponse">
 <part name="result" type="ns:ArrayOfns__Student"/>
</message>
 
<portType name="anmeldeServerPortType">
 <operation name="getVersion">
  <documentation>returns the <i>version</i> as string like 00.01.01</documentation>
  <input message="tns:getVersionRequest"/>
  <output message="tns:getVersionResponse"/>
 </operation>
 <operation name="addStudent">
  <documentation>adds student to one of two groups (1,2) and returns a <i>Status</i> 1,2 or -1 if failed.</documentation>
  <input message="tns:addStudentRequest"/>
  <output message="tns:addStudentResponse"/>
 </operation>
 <operation name="getStudent">
  <documentation>Service definition of function ns__getStudent</documentation>
  <input message="tns:getStudent"/>
  <output message="tns:Student"/>
 </operation>
 <operation name="listStudents">
  <documentation>Service definition of function ns__listStudents</documentation>
  <input message="tns:listStudentsRequest"/>
  <output message="tns:listStudentsResponse"/>
 </operation>
</portType>
 
<binding name="anmeldeServer" type="tns:anmeldeServerPortType">
 <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
 <operation name="getVersion">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
 <operation name="addStudent">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
 <operation name="getStudent">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
 <operation name="listStudents">
  <SOAP:operation style="rpc" soapAction=""/>
  <input>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </input>
  <output>
     <SOAP:body use="encoded" namespace="urn:bhtvs2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  </output>
 </operation>
</binding>
 
<service name="anmeldeServer">
 <documentation>fuer BHT VS2 Studenten </documentation>
 <port name="anmeldeServer" binding="tns:anmeldeServer">
  <SOAP:address location="http://www.jnks.de:80"/>
 </port>
</service>
 
</definitions>
 
Soo, ich habe den Quellcode etwas angepasst und das hier ist das ergebnis:

Code:
private void showAllActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        try { // Call Web Service Operation
            bhtvs2.AnmeldeServer service = new bhtvs2.AnmeldeServer();
            bhtvs2.AnmeldeServerPortType port = service.getAnmeldeServer();
            // TODO process result here
            bhtvs2.ArrayOfnsStudent result = port.listStudents();
            bhtvs2.Student[] student = new bhtvs2.Student[result.getAny().size()];
            student = result.getAny().toArray(student);
            //bhtvs2.
            System.out.println("Result = " + result.getAny().size());
            System.out.println("Result = " + result.getArrayType().toString());
            System.out.println("Result = " + result.getClass());
            System.out.println("Result = " + result);
            
            for(int count=0; count<result.getAny().size() ;count++) {
                //System.out.println("Result = " + result.getAny().getClass());
                System.out.println("Student: " + student[count].getName());
            }
        } catch (Exception ex) {
            // TODO handle custom exceptions here
            ex.printStackTrace();
        }

    }

Die mir, leider, folgende Exception liefert:

Code:
java.lang.ArrayStoreException
        at java.lang.System.arraycopy(Native Method)
        at java.util.ArrayList.toArray(ArrayList.java:306)
        at anmeldesystemclient.WorkingWindow.showAllActionPerformed(WorkingWindow.java:320)
        at anmeldesystemclient.WorkingWindow.access$400(WorkingWindow.java:27)
        at anmeldesystemclient.WorkingWindow$5.actionPerformed(WorkingWindow.java:120)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6216)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5981)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4583)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Hat jemand Tipps, wo mein Fehler liegt?
 
ArrayStoreException fliegt immer, wenn du versuchst, verschiedene Typen in ein und das selbe Array zu legen. Ich seh allerdings in deinem Code nicht ganz durch...

REINHAUN!

PS: Warum schlägt man mit sowas unbrauchbaren wie SOAP nach so einer Anforderung? ;)
 
@ Oliver: Weil das leider der Weg ist, der uns voM Server vorgegeben wird.

Problem erledigt im übrigen :) Das Problem war, wie immer, ein 1d10T Problem - ich habe beim generieren der Programstubs einfach übersehen, auf JAX-RPC zu schalten ... Nu t es und t und t ... *grummelt leise*
 

Neue Beiträge

Zurück