6

だから私は単純な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;
    }

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>

戻りタグに値が必要な理由は、クライアント側から、Web ページで jQuery AJAX を使用してこの Web サービスを呼び出しており、取得している応答 XML が空の<return>タグであるためです。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 サービスでテストしたところ、うまくいきました。

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 オブジェクトを返すようにする方法

Web サービスなどを介して Java 固有の構造を公開しないでください。 Web サービスは相互運用性に関するものであり、あなたのような道をたどるのは間違った方法です。 必要な情報を返すだけで、作成されたプログラミング言語に関係なく、Web サービス クライアントがハッシュ テーブルを構築できるようになります。HashMap

于 2012-06-19T21:02:46.313 に答える
1

JBoss Forum で、Glassfish で動作する解決策を見つけました。元のソリューションは、Allesio Soldano のトピックである JBoss Forum にあります。これは、ネストされたタイプ ie として HashMap を持つ 1 つの補助クラスから構成され 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 に答える