Toon posts:

Java webservices Objecten versturen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik heb een project waarbij ik een dubbele stringarray (String[][]) wil versturen naar de client vanaf de webserver. Ik ben er achter dat je die stringarray eerst naar een object moet casten, om het vervolgens in de client weer naar een String[][] te casten.
Maar helaas gaat dat fout:
Het op de webserver doe ik zo:
Java:
1
2
3
String[][] returnString = new String[5][5];
// methode om de returnString te vullen
return (Object) returnString;


Bij de client probeer ik hem als volgt weer te casten:
Java:
1
String[][] vragen = (String[][]) port.geefVragen();

Ik krijg dan een internal server error bij het casten vanaf het object naar de String[][].

Nu heb ik ook iets gehoord over serializen van objecten. Alleen in de meeste voorbeelden wordt een Object naar een bestand geserialized, dat lijkt me niet de bedoeling bij een webserver. Hoe moet het dan wel of wat doe ik fout?

Alvast bedankt.

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 28-01 13:12

jAnO!

lalalavanillevla

paar vraagjes om info:
wat gebruik je? axis? xfire?
welke exception krijg je?

En nee het is normaliter niet nodig om de boel eerst naar object te casten.

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


Verwijderd

Topicstarter
Oh sorry, vergeten te melden.
Maar ik gebruik Netbeans 5.5 om het spul te coden en Sun Application Server 9 om de webservice op te draaien.
Ik krijg de volgende foutmelding in de log-files van de Sun Application Server te zien:
"Error in encoding SOAP Message at com.sun.xm.ws.encoding.soap.server.SOAPXMLEncoder.toSOAPMessage(SOAPXMLEncoder.java 115)".
Zo te zien vind het systeem het niet zo leuk dat er een object in de SOAPMessage staat, want als ik een gewone string op dezelfde manier probeer te versturen gaat het wel goed.

[ Voor 58% gewijzigd door Verwijderd op 22-02-2007 16:14 ]


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Waarom cast je in hemelsnaam naar een Object :?
Als je je interface goed gedefinieerd heb (meestal door een WSDL file, of in het geval van JAX-WS, wat jij gebruikt volgens mij, door Annotations) is het helemaal niet nodig om te casten naar een Object.

Verder kunnen we er niet zoveel mee, als we niet weten hoe je web service eruit ziet. Post dus even je WSDL of je service definitie dmv Annotations.

Ducati: making mechanics out of riders since 1946


Verwijderd

Topicstarter
Ik cast naar een Object omdat het volgens mij niet mogelijk is om een String[][] te versturen.
Als dat wel mogelijk is zou dat natuurlijk wel mooi zijn, want dat scheelt weer een extra handeling.
Maar mijn (verkorte) WSDL ziet er als volgt uit, het gaat om de functie geefVraag:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://hsdwebservices/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://hsdwebservices/" name="WebKiezerService">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://hsdwebservices/" schemaLocation="http://laptopgerben:8080/WebKiezer/WebKiezerService/__container$publishing$subctx/WEB-INF/wsdl/WebKiezerService_schema1.xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"/>
    </xsd:schema>
  </types>
  <message name="geefVraag">
    <part name="parameters" element="tns:geefVraag"/>
  </message>
  <message name="geefVraagResponse">
    <part name="parameters" element="tns:geefVraagResponse"/>
  </message>
  <portType name="WebKiezer">
    <operation name="geefVraag">
      <input message="tns:geefVraag"/>
      <output message="tns:geefVraagResponse"/>
    </operation>
  </portType>
  <binding name="WebKiezerPortBinding" type="tns:WebKiezer">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="geefVraag">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="WebKiezerService">
    <port name="WebKiezerPort" binding="tns:WebKiezerPortBinding">
      <soap:address location="http://laptopgerben:8080/WebKiezer/WebKiezerService" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"/>
    </port>
  </service>
</definitions>

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 14:03

NetForce1

(inspiratie == 0) -> true

Je kan die String array wel casten naar Object, maar daarmee blijft het natuurlijk gewoon een String array. Je webservice engine zal dus moeten weten hoe een array te serializen.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • latka
  • Registratie: Januari 2002
  • Laatst online: 13:01
Je gebruikt document literal als type webservice (dit is ok), maar dan is het belangrijk om te weten wat het gebruikte schema is. Ik heb geen ervaring met glassfish9, maar in mijn ervaring kun je met document literal wel vergeten dat alles vanzelf gemapped(=serialized) wordt. Wat jij eigenlijk verwacht is dat je webservice een RPC (remote procedure call) is. Geen oplossing kan en klare oplossing dus, maar wellicht wat pointers om je verder op weg te helpen.

Verwijderd

Topicstarter
Als ik het goed begrijp moet ik er bij het soapbinding element dus voor zorgen dat de style "rpc" is i.p.v. document? Dan moet ik daar straks maar even mee prutsen.

Mijn (verkorte) schema ziet er als volgt uit:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://hsdwebservices/" xmlns:tns="http://hsdwebservices/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="geefVraag" type="tns:geefVraag"/>

  <xs:element name="geefVraagResponse" type="tns:geefVraagResponse"/>
  <xs:complexType name="geefVraag"/>

  <xs:complexType name="geefVraagResponse">
    <xs:sequence>
      <xs:element name="return" type="xs:anyType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Ik heb even geprobeerd om met JAVA te beginnen en dan de WSDL te genereren.
Als je dan een methode definieert die een String[][] teruggeeft, dan wordt er gewoon een geldige WSDL + XSD schema gegenereerd.

Kijk daar even naar, zou ik zeggen :)

edit: Er worden 2 XSD files gegenereerd:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xs:import namespace="http://jaxb.dev.java.net/array" schemaLocation="SeiTestService_schema2.xsd"/>

  <xs:element name="getArray" type="tns:getArray"/>

  <xs:element name="getArrayResponse" type="tns:getArrayResponse"/>

  <xs:complexType name="getArray">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="getArrayResponse">
    <xs:sequence>
      <xs:element name="return" type="ns1:stringArray" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>


en:

XML:
1
2
3
4
5
  <xs:complexType name="stringArray" final="#all">
    <xs:sequence>
      <xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
    </xs:sequence>
  </xs:complexType>


Wat hij dus doet, is een array van array's terug geven :)

[ Voor 64% gewijzigd door TheNameless op 23-02-2007 11:09 ]

Ducati: making mechanics out of riders since 1946


Verwijderd

Topicstarter
Kijk, waarom werkt het daar wel en hier niet :( ?
Want ook als ik een String[][] teruggeef dan komt er in de xsd nog steeds anyType te staan als type.
Vermoedelijk wordt de WSDL dus verkeerd gegenereerd door netbeans?

Bedankt voor de reacties.

Op dit moment ben ik bezig om van de String[][] arrays een lange string met scheidingstekens te maken. Want dat werkt wel heb ik net getest. Mooi en leuk is anders, maar dat is voorlopig de snelste oplossing.

[ Voor 29% gewijzigd door Verwijderd op 23-02-2007 11:30 ]


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Het kan zijn dat netbeans een oudere versie van de JAX-WS RI gebruikt, bovenstaande XSD schema's zijn gegenereerd met JAX-WS 2.1 en dus ook JAXB 2.1.

Netbeans gebruikt naar mijn weten JAX-WS 2.0 en dus ook JAXB 2.0

[ Voor 25% gewijzigd door TheNameless op 23-02-2007 11:35 ]

Ducati: making mechanics out of riders since 1946


Verwijderd

Topicstarter
Jouw weten klopt, want in de server manager zag ik dat Netbeans gebruikt maakt van de modules JAX-WS 2.0, JAX RPC 1.6, JAX-WS Model. Dit zou dus een oorzaak van het probleem kunnen zijn?

Ik ga nu proberen om de modules te updaten, hopelijk werkt dat. En anders worden het vermoedelijk toch strings met scheidingstekens :(.

Maar bedankt voor de reacties, ik weet nu in ieder geval in welke richting ik het probleem moet zoeken
Pagina: 1