6

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

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

book 类也很简单:

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

4

3 回答 3

3

为了帮助 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。有几种方法可以做到这一点,所以我建议你检查一下

于 2012-06-20T08:20:42.923 回答
2

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

您不应公开任何 Java 特定的结构,例如HashMap通过 Web 服务。
Web 服务是关于互操作性的,像你这样的路径是错误的。
只需返回所需的信息,以便 Web 服务客户端可以构建哈希表,而不管它是用哪种编程语言编写的

于 2012-06-19T21:02:46.313 回答
1

在 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);
  }
}

在 Webservice 中直接使用该类作为返回对象,无需任何额外设置。当然,必须先创建对象,然后像在另一个 POJO 中一样填充映射。

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

于 2014-07-17T17:25:57.350 回答