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

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

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

书类也很简单:

 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服务时,我得到:

 Method returned my.ws.HashMap : "my.ws.HashMap@1f3cf5b" SOAP Request ... ... SOAP Response         

是否可以将返回的HashMap对象显示在标记中,例如

   id=1 title=title1     id=2 title=title2   

我想在返回标记中使用值的原因是,从客户端,我在网页中使用jQuery AJAX来调用此Web服务,而我得到的响应XML只是空标记。 我如何从AJAX客户端获得真正的账面价值?

这是我的AJAX Web代码:

  $.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服务进行了测试,并且工作正常。

为了帮助JAXB,您可以将HashMap “包装”在一个类中,并使用@XmlJavaTypeAdapter将映射的自定义序列化为XML。

 public class Response { @XmlJavaTypeAdapter(MapAdapter.class) HashMap books; public HashMap getBooks() { return mapProperty; } public void setBooks(HashMap map) { this.mapProperty = map; } } 

然后使用此类作为WebMethod的返回值

 @WebMethod(operationName="getBookList") public Response getBookList() { HashMap books = new HashMap(); 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 。 有几种方法可以做到这一点,所以我建议你检查一下

JAX-WS如何使SOAP Response返回Hashmap对象

您不应该通过Web服务公开任何Java特定的构造,如HashMap
Web服务是关于互操作性的 ,跟随像你这样的路径是错误的方式。
只需返回所需的信息,以便Web服务客户端可以构建哈希表,无论其编写的编程语言如何

在JBoss论坛上,我找到了解决方案,它适用于Glassfish。 原始解决方案是在JBoss论坛上,主题来自Allesio Soldano 。 它由一个辅助类组成,它有一个HashMap作为嵌套类型,即HashMap 。 比在Web服务类中,此辅助类用作返回值。 注释@XmlAccessorType(XmlAccessType.FIELD)确保SOAP响应中的SOAP将正确处理该结构。

 @XmlAccessorType(XmlAccessType.FIELD) public class MyHash { protected HashMap realMap; // constructor public MyHash() { realMap = new HashMap(); } /** * @return HashMap */ public HashMap getRealMap() { if (realMap==null) { realMap = new HashMap(); } return realMap; } /** * @param key * @param value */ public void put(String key, String value) { realMap.put(key, value); } } 

在Webservice中,将此类直接用作返回对象,而无需任何其他设置。 当然,必须首先创建对象,并且应该像在另一个POJO中一样填充地图。

如果HashMap由另一个非原始类型(对象)组成,我certificate,可以在嵌套的复杂对象上递归使用相同的方式。 规则是,该类不是inheritance的,即它必须嵌套为属性,最后一个类具有所有属性原语。