wie ArrayList an Webservice geben?

Diskutiere wie ArrayList an Webservice geben? im SOA Forum

  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.

Java Videokurs

Keine Antwort auf Deine Suche gefunden? Registriere Dich kostenlos und stelle Deine eigene Frage zu Java!

Jetzt kostenlos registrieren