wie ArrayList an Webservice geben?

  1. #1
    Lenzen


    wie ArrayList an Webservice geben?
    Ich versuch schon eine Ewigkeit eine ArrayList mit einem Webservice aufzurufen.
    Mein Versuch:

    Java Code:
    1.  
    2. import java.util.ArrayList;
    3.  
    4. import javax.jws.WebMethod;
    5. import javax.jws.WebService;
    6. import javax.jws.soap.SOAPBinding;
    7. /**
    8.  * Web Service End-point implementation class
    9.  */
    10.  
    11. @WebService(name = "TEST_name", serviceName = "TEST_serviceName")
    12. @SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL)
    13.  
    14. public class Hello {
    15. // Constructor
    16. public void Hello() {}
    17.  
    18. @WebMethod
    19. public String sayHello(String name) {
    20. return "Hello, " + name + ".";
    21. }
    22.  
    23. @WebMethod
    24. public int addNumbers(int number1, int number2) {
    25. return number1 + number2;
    26. }
    27.  
    28. @WebMethod
    29. public double divideNumbers(int dividend, int divisor)
    30. throws Exception {
    31. if (divisor == 0) {
    32. throw new Exception("Divisor cannot be zero!");
    33. }
    34. return (double)dividend/divisor;
    35. }
    36.  
    37. @WebMethod
    38. public ArrayList<Object> testArrayList() {
    39. ArrayList<Object> results = new ArrayList<Object>();
    40. int title = 1;
    41. String description = "Description";
    42. double d = 44.66;
    43. long l = 66;
    44. String st = "Stringtest";
    45. results.add(title);
    46. results.add(description);
    47. results.add(d);
    48. results.add(l);
    49. results.add(st);
    50. return results;
    51. }
    52. }


    Request:
    [XML]
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://Webservice2/">
    <soapenv:Header/>
    <soapenv:Body>
    <web:testArrayList/>
    </soapenv:Body>
    </soapenv:Envelope>
    [/XML]

    Response
    [XML]
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:testArrayListResponse xmlns:ns2="http://Webservice2/">
    <return/>
    </ns2:testArrayListResponse>
    </S:Body>
    </S:Envelope>
    [/XML]

    Nun habe ich folgende Zeile auskommentiert:
    Java Code:
    1.  
    2. @SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL)


    Als Response bekomme ich (fast das was ich will):
    [XML]
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:testArrayListResponse xmlns:ns2="http://Webservice2/">
    <return xsi:type="xs:int" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">1</return>
    <return xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">Description</return>
    <return xsi:type="xs:double" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">44.66</return>
    <return xsi:type="xs:long" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">66</return>
    <return xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">Stringtest</return>
    </ns2:testArrayListResponse>
    </S:Body>
    </S:Envelope>
    [/XML]

    und einen Validerungsfehler:
    Invalid xsi:type qname: 'xs:int'
    Invalid xsi:type qname: 'xs:string'
    Invalid xsi:type qname: 'xs:double'
    Invalid xsi:type qname: 'xs:long'
    Invalid xsi:type qname: 'xs:string'


    Was mache ich falsch?

  2. #2
    Lenzen


    Mittlerweile denke ich, dass man komplexe Datentypen nicht an einen Webservice geben kann. Über eine Bean klappt das. Vielleicht hat ja noch jemand eine Idee?

    Meine komplette Lösung bisher:
    Java Code:
    1.  
    2. package test;
    3.  
    4. import java.util.ArrayList;
    5. import java.util.Collection;
    6.  
    7. import javax.jws.WebMethod;
    8. import javax.jws.WebResult;
    9. import javax.jws.WebService;
    10. import javax.jws.soap.SOAPBinding;
    11. /**
    12.  * Web Service End-point implementation class
    13.  */
    14.  
    15. @WebService(name = "TEST_name", serviceName = "TEST_serviceName")
    16. //@SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL)
    17.  
    18. public class Hello {
    19. // Constructor
    20. public void Hello() {}
    21.  
    22. @WebMethod
    23. public String sayHello(String name) {
    24. return "Hello, " + name + ".";
    25. }
    26.  
    27. @WebMethod
    28. public int addNumbers(int number1, int number2) {
    29. return number1 + number2;
    30. }
    31.  
    32. @WebMethod
    33. public double divideNumbers(int dividend, int divisor)
    34. throws Exception {
    35. if (divisor == 0) {
    36. throw new Exception("Divisor cannot be zero!");
    37. }
    38. return (double)dividend/divisor;
    39. }
    40.  
    41. @WebMethod
    42. public ArrayList<Param> testArrayList(ArrayList<Param> results) {
    43. /**
    44. Param p = new Param();
    45.   int title = 222;
    46.   String description = "Description2";
    47.   double d = 22.22;
    48.   long l = 222222;
    49.   String st = "Stringtest2";
    50.  
    51.   p.setTitle(title);
    52.   p.setDescription(description);
    53.   p.setD(d);
    54.   p.setL(l);
    55.   p.setSt(st);
    56.  
    57.   results.add(p);
    58.   **/
    59.  
    60. return results;
    61. }
    62.  
    63. @WebResult(name = "parameter")
    64. public Collection<Param> getCollection(Collection<Param> param) {
    65. /**
    66. Param p = new Param();
    67. int title = 222;
    68. String description = "Description2";
    69. double d = 22.22;
    70. long l = 222222;
    71. String st = "Stringtest2";
    72.  
    73. p.setTitle(title);
    74. p.setDescription(description);
    75. p.setD(d);
    76. p.setL(l);
    77. p.setSt(st);
    78.  
    79. param.add(p);
    80. **/
    81. return param;
    82. }
    83. }


    Jetzt die dazugehörige Bean:
    Java Code:
    1.  
    2. package test;
    3.  
    4. import javax.jws.WebService;
    5.  
    6. @WebService
    7. public class Param{
    8.  
    9. int title;
    10. String description;
    11. double d;
    12. long l;
    13. String st;
    14.  
    15. public Param() {
    16. // empty constructor
    17. }
    18.  
    19. public Param(int title, String description, double d, long l, String st) {
    20. this.title = title;
    21. this.description = description;
    22. this.d = d;
    23. this.l = l;
    24. this.st = st;
    25. }
    26.  
    27. public int getTitle(){return title;}
    28. public void setTitle(int title){this.title = title;}
    29.  
    30. public String getDescription(){return description;}
    31. public void setDescription(String description){this.description = description;}
    32.  
    33. public double getD(){return d;}
    34. public void setD(double d){this.d = d;}
    35.  
    36. public long getL(){return l;}
    37. public void setL(long l){this.l = l;}
    38.  
    39. public String getSt(){return st;}
    40. public void setSt(String st){this.st = st;}
    41. }


    ... und die Startklasse:
    Java Code:
    1.  
    2. package test;
    3.  
    4. import javax.xml.ws.Endpoint;
    5.  
    6.  
    7. public class Server {
    8.  
    9. public static void main (String args[]) {
    10. Hello server = new Hello();
    11. Endpoint.publish("http://localhost:8080/Server", server);
    12. }
    13. }


    und der Request:
    [XML]
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test/">
    <soapenv:Header/>
    <soapenv:Body>
    <test:testArrayList>
    <arg0>
    <d>12</d>
    <description>Description</description>
    <l>66</l>
    <st>Stringtest</st>
    <title>1</title>
    </arg0>
    </test:testArrayList>
    </soapenv:Body>
    </soapenv:Envelope>
    [/XML]

    und die Response:
    [XML]
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:testArrayListResponse xmlns:ns2="http://test/">
    <return>
    <d>12.0</d>
    <description>Description</description>
    <l>66</l>
    <st>Stringtest</st>
    <title>1</title>
    </return>
    </ns2:testArrayListResponse>
    </S:Body>
    </S:Envelope>
    [/XML]

  3. #3
    waldek87


    Probier es mal mit dem List anstatt ArrayList als Rückgabetyp

  4. #4
    Frank04


    Eine ArrayList wird bei der Übertragung automatisch zur List. Der Client muss auch die erhaltenen Daten in eine List speichern.

    Hast Du die Validation der Nachrichten an?

    Java Code:
    1. @WebService
    2. @SchemaValidation()


    Auf einer Tomcat7 und einer Websphere 6.1 Implementierung funktioniert die Listenübergabe.

Ähnliche Themen
  1. ArrayList via WebService übertragen
    Von HFT im Forum Netzwerkeprogrammierung
    Antworten: 3
    Letzter Beitrag: 04.04.2011, 13:01
  2. Webservice definieren und andere Webservice aufrufen
    Von Taramsis im Forum Allgemeine Java-Themen
    Antworten: 8
    Letzter Beitrag: 19.08.2010, 10:41
  3. Webservice, ArrayList übergeben
    Von Capasso im Forum Netzwerkeprogrammierung
    Antworten: 3
    Letzter Beitrag: 21.05.2008, 22:21
  4. Von WebService auf anderen WebService zugreifen?
    Von nEp im Forum Netzwerkeprogrammierung
    Antworten: 8
    Letzter Beitrag: 13.01.2008, 01:13