4

RESTful Web サービスを使用しています。この Web サービスでは、保存する Bean をパラメーターとして渡す必要があります。

サーバーコードは次のとおりです。

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Unidade inserir(Unidade unidade){
    Session s = ConnectDb.getSession();
    try {
        s.getTransaction().begin();
        s.save(unidade);
        s.getTransaction().commit();
        return unidade;
    } catch (Exception e) {
        e.printStackTrace();
        s.getTransaction().rollback();
        return null;
    } finally {
        s.close(); 
    }
}

クライアントに次のコードがあります。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource webResource = client.resource("http://localhost:8080/RestauranteWeb/rest/unidades/7");
Builder builder = webResource.accept(MediaType.APPLICATION_JSON); 
GenericType<Unidade> genericType = new GenericType<Unidade>() {};

Unidade u = new Unidade();
u.setUnidSigla("KG");
//How to pass this bean as parameter?

Unidade response = builder.post(genericType);
System.out.println(response);

Bean をパラメーターとしてメソッドに渡すにはどうすればよいですか?

4

4 に答える 4

2

Bean をパラメーターとしてメソッドに渡すにはどうすればよいですか?

postメソッドのドキュメントをチェックアウトします。

 /**
 * Invoke the POST method with a request entity that returns a response.
 * 
 * @param <T> the type of the response.
 * @param c the type of the returned response.
 * @param requestEntity the request entity.
 * @return an instance of type <code>c</code>.
 * @throws UniformInterfaceException if the status of the HTTP response is 
 *         greater than or equal to 300 and <code>c</code> is not the type
 *         {@link ClientResponse}.
 * @throws ClientHandlerException if the client handler fails to process
 *         the request or response.
 */
<T> T post(Class<T> c, Object requestEntity) 
        throws UniformInterfaceException, ClientHandlerException;

このメソッドは 2 つのパラメーターを取ります。最初のパラメーターは予想される応答タイプで、2 番目のパラメーターは要求本文に入れられるエンティティです。

ここで何が起こるか、リクエストを実行すると、Jersey はリクエスト エンティティとして渡されたオブジェクトを JSON 文字列にシリアル化します (したがって、ヘッダーを設定しました - accept(MediaType.APPLICATION_JSON))。サーバーからの応答が到着すると、Jersey はそれを逆シリアル化し ( の場合と逆のプロセスrequestEntity)、オブジェクトを返します。

また、メソッドが複数のパラメーターを受け取った場合はどうなりますか? post メソッドは 1 しか受け入れないため

JAX-RS でそれを行うことはできず、実際にはほとんど意味がありません。複数のパラメーターを@PathParamまたはとしてメソッドに渡すこと@MatrixParamができますが、ボディに関連付けることができるのは 1 つだけです (リクエストにはボディが 1 つしかありませんよね?)。この質問への回答を確認し、@PathParamまたは@MatrixParamの使用方法を確認してください

「Unidade」クラスを返す代わりに、私のメソッドが文字列を返すとしましょう。そのため、パラメータとして「Unidade」を受け取り、「文字列」を返します。この場合、以前のように「Unidade」インスタンスを渡して取得するにはどうすればよいですか?

でそれを達成できると思いますpost(String.class, unidadeInstance)。最初のパラメーターは 2 番目のパラメーターと同じである必要はありません。1 つのパラメーターを受け入れて別のパラメーターを返すことは有効です。パラメータを取り、本文に何も返さないことも有効です(質問に添付されたコードで行ったように)。本文を受け入れて、新しく作成されたリソースの URL を指すステータス201 Createdとヘッダー エントリを含む応答を送り返すことができます。Location

于 2013-07-28T11:51:51.427 に答える
1

GenericType の目的がわかりません。とにかく、以下のコードを試してください。

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
Unidade u = new Unidade();
u.setUnidSigla("KG");
WebResource webResource = client.resource("http://localhost:8080/RestauranteWeb/rest/unidades/7");
Unidade response = webResource.accept(MediaType.APPLICATION_JSON)
                          .type(MediaType.APPLICATION_JSON)
                           .post(Unidade.class, u);
于 2013-07-24T03:38:15.477 に答える
0

それが役立つかどうかはわかりませんが、同様の問題がありました。私のシナリオは、一種のプロファイルとして編成された一連の値を受信する必要がある Web サービスが必要でした。しかし、このサービスは、まだサービスを使用している古いクライアントのプロファイルが増えることに対処する必要があります。インターフェイスは可能な限り静的にする必要がありました。

私たちのソリューションはとてもシンプルです。投稿の内容として、単一のテキスト フィールドのみを投稿します。ただし、これには、JSON のプロファイル オブジェクトのシリアル化された状態が含まれます。擬似コード:

public class Profile1 {
  ...

  public String asJSON() {
    JSONObject obj = new JSONObject();
    obj.put("profileAtr1", profileAtr1);
    ...
    return obj.toString()
  }
}

formParams.put("profile", profile.asJSON());
client.post(formParams);

この方法では、自動的にデシリアライズされませんが、手動で簡単にデシリアライズできます。これは、コンストラクターで JSON 文字列から作成できる汎用の Profile オブジェクトを使用して行います。擬似コード:

public GenericProfile {
  public GenericProfile(String json) {
    JSONObject obj = new JSONObject(json);
    String profileName = obj.getString("profileName");

    if (profileName.equals("Profile1") {
      this = new Profile1(obj);   // I know this is not working ;) My impl. is a litle bit more complecated as that. I think i use a static method in the generic profile to create an instance i need.
    } ...
  }
}

そして、あなたのWebサービスには、処理して逆シリアル化するフォームパラメータが1つだけあります;)疑似コード:

public ResponseEnvelope coolServiceFunction(@FormParam("profile") String profileData) {
  GenericProfile profile = new GenericProfile(profileData);

  if (profile instanceof Profile1) {
    do what you want
  }
}

疑似コードで申し訳ありませんが、私はすでに開発用 VM をシャットダウンしており、もうどのリポジトリにもアクセスできません :( このソリューションの最大の利点は次のとおりです。1. JSON にパックできるものは何でも転送できます。BASE64 を転送します。 2. POST サービスの REST フレームワークの最も簡単なチュートリアルの例は、これを行うために必要なすべてを提供します. 3. インターフェイスが長期間維持されることを確認できます. .

それが役立つことを願っています

于 2013-07-30T19:47:57.273 に答える