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

2019-06-25 15:06发布

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

    @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;
    }

书类也很简单:

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

<?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对象<return>标签,像

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

为什么我要在返回变量的数值的原因是因为,从客户端,我在网页中使用jQuery AJAX调用这个Web服务,并响应XML,我得到的是只是空<return>标签。 如何我得到来自AJAX客户端的实际账面价值?

这里是我的AJAX网页代码:

   $.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服务测试,它的工作。

Answer 1:

为了帮助JAXB,你可以“包装”您的HashMap的一类,并使用@XmlJavaTypeAdapter ,使地图以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 。 有几种方法可以做到这一点,所以我建议你检查这



Answer 2:

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

应该让像任何Java特定结构HashMap通过Web服务。
Web服务是关于互操作性和以下路径像你是走错了路。
只返回必需的,以便Web服务客户端可以建立哈希表,无论它是书面的编程语言的信息



Answer 3:

在JBoss论坛,我发现解决方案,它为我的作品在Glassfish。 原来的解决方案是在JBoss的论坛上,来自Allesio Soldano改装的话题 。 它由从一个辅助类,它有一个HashMap嵌套类型即HashMap<String, String> 。 比Web服务类此辅助类用作返回值。 注释@XmlAccessorType(XmlAccessType.FIELD)确保,该结构将通过SOAP在SOAP响应适当处理。

@XmlAccessorType(XmlAccessType.FIELD)
public class MyHash {
  protected HashMap<String,String> realMap;

  // constructor
  public MyHash() {
    realMap = new HashMap<String,String>();
  }

  /**
   * @return HashMap<String,String>
   */
  public HashMap<String,String> getRealMap() {  
    if (realMap==null) {  
      realMap = new HashMap<String,String>();  
    }
    return realMap;  
  }

  /**
   * @param key
   * @param value
   */
  public void put(String key, String value) {
    realMap.put(key, value);
  }
}

在web服务直接使用这个类作为一个返回对象没有任何额外的设置。 当然,必须首先创建的对象与地图应类似于在另一个POJO被填充。

如果HashMap中由来自另一非原始类型(对象),我校对,有可能递归地使用相同的方式在嵌套复杂的对象。 规则是,这个类是不能继承,即它必须嵌套为属性和最后一堂课了所有的原始属性。



文章来源: JAX-WS: How to make a SOAP Response return a HashMap object