JAX-WS:如何使SOAP响应返回一个HashMap对象

JAX-WS:如何使SOAP响应返回一个HashMap对象

问题描述:

所以我有一个简单的Web服务:

So I have a simple web service:

    @WebMethod(operationName="getBookList")
    public HashMap<Integer,Book> getBookList()
    {
        HashMap<Integer, Book> books = new HashMap<Integer,Book>();
         Book b1 = new Book(1,"title1");
         Book b2 = new Book(2, "title2");
         books.put(1, b1);
         books.put(2, b2);
        return books;
    }

这本书类也是简单的:

The book class is also simple:

public class Book
{
    private int id;
    private String title;

    public int getId()
    {
        return id;
    }

    public String getTitle()
    {
        return title;
    }
    public Book(int id, String title)
    {
        id = this.id;
        title = this.title;
    }
}

现在,当你在浏览器的测试仪调用这个Web服务,我得到:

Now when you call this web service in browser's tester, I get:

Method returned
my.ws.HashMap : "my.ws.HashMap@1f3cf5b"

SOAP Request
  ...
  ...

SOAP Response

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:getBookListResponse xmlns:ns2="http://ws.my/">
            <return/>
        </ns2:getBookListResponse>
    </S:Body>
</S:Envelope>


是否有可能有返回的的HashMap 的所示对象&LT;返回&GT; 标签,像


Is it possible to have the returned HashMap object shown in <return> tag, something like

<return>
     <Book1>
          id=1
          title=title1
     </Book1>
</return>
<return>
     <Book2>
          id=2
          title=title2
     </Book2>
</return>

为什么我要在返回变量值的原因是因为,从客户端,我使用jQuery的AJAX在网页中调用这个Web服务,而响应XML我得​​到的只是一句&LT;返回&GT; 标签。我如何以往任何时候都得到AJAX客户端真正的账面价值?

The reason why I want the values in return tags is because, from client side, I am using jQuery AJAX in a web page to call this web service, and the response XML I am getting is just empty <return> tags. How do I ever get the real book value from AJAX client side?

下面是我的AJAX的web code:

Here's my AJAX web code:

   $.ajax({
        url: myUrl, //the web service url
        type: "POST",
        dataType: "xml",
        data: soapMessage, //the soap message. 
        complete: showMe,contentType: "text/xml; charset=\"utf-8\""         

    });
function showMe(xmlHttpRequest, status)
{  (xmlHttpRequest.responseXML).find('return').each(function()
   { // do something
   }
}

我测试了简单的Hello World Web服务和它的工作。

I tested with simple hello world web service and it worked.

为了帮助JAXB,您可以包你的的HashMap 中的一类,并使用 @XmlJavaTypeAdapter 来使地图以XML的自定义序列化。

In order to help JAXB, you can 'wrap' your HashMap in a class and use the @XmlJavaTypeAdapter to make your custom serialization of the map to XML.

public class Response {

    @XmlJavaTypeAdapter(MapAdapter.class)    
    HashMap<Integer, Book> books;

    public HashMap<Integer, Book> getBooks() {
        return mapProperty;
    }

    public void setBooks(HashMap<Integer, Book> map) {
        this.mapProperty = map;
    }

}

然后使用这个类作为一个返回值的的WebMethod

@WebMethod(operationName="getBookList")
    public Response getBookList()
    {
         HashMap<Integer, Book> books = new HashMap<Integer,Book>();
         Book b1 = new Book(1,"title1");
         Book b2 = new Book(2, "title2");
         books.put(1, b1);
         books.put(2, b2);
         Response resp = new Response();
         resp.setBooks(books);
         return resp;
    }

毕竟,你需要实现您的适配器 MapAdapter 。有几种方法可以做到这一点,所以我建议你检查this

After all, you need to implement your adapter MapAdapter. There is several ways to do this, so I recommend you to check this