2016-03-27 5 views
1

EclipseでJAX-RSを使用してJava REST APIメソッドから複数のオブジェクト(String、Boolean、MyOwnClassなど)を返そうとしています。ここでJava REST API:APIから複数のオブジェクトを返す方法

は、私が今持っているものです。

私のAPIメソッド

@Path("/") 
public class myAPI { 

    @GET 
    @Produces({ "application/xml", "application/json" }) 
    @Path("/getusers") 
    public Response GetAllUsers() { 

     //Data Type #1 I need to send back to the clients 
     RestBean result = GetAllUsers(); 

     //Data Type #2 I need to send with in the response 
     Boolean isRegistered = true; 

     //The following code line doesn't work. Probably wrong way of doing it 
     return Response.ok().entity(result, isRegistered).build(); 
    } 
} 

RestBeanクラス:

public class RestBean { 
    String status = ""; 
    String description = ""; 
    User user = new User(); 

    //Get Set Methods 
} 

だから私は基本的にデータタイプを送信しています:RestBeanおよびブール

JSONレスポンスを複数のデータオブジェクトで返信する正しい方法は何ですか?

+1

A RESTレスポンス良いでしょうトップレベルには1つのオブジェクトしか持てませんが、そのトップレベルオブジェクトにブール値とレストビーンの両方が含まれている必要はありません。 (JSONObject実装の1つを使用して)手動で構築するか、目的のオブジェクトを生成するアノテーション付きクラスを作成する必要があります – Tibrogargan

+0

最後のコード行から1つの戻りオブジェクトを削除すると、レスポンスResponse.ok()。エンティティ(結果)。ビルド();あれは正しいですか? @Tibrogargan – Dinuka

+0

実装全体が正しいかどうか分かりませんが、エンティティ()の正しい使用になります。 – Tibrogargan

答えて

5

第1に、Javaの規則は、クラス名が大文字で始まり、メソッド名が小文字で始まるということです。それに従うことは、一般的には良い考えです。

@Tibrogarganが示唆するように、あなたはあなたの応答を単一のクラスの中にラップする必要があります。

public class ComplexResult { 
    RestBean bean; 
    Boolean isRegistered; 

    public ComplexResult(RestBean bean, Boolean isRegistered) { 
     this.bean = bean; 
     this.isRegistered = isRegistered; 
    } 
} 

、その後、あなたのリソースは、あなたが本当に知っている必要があり何

public Response getAllUsers() { 
    RestBean restBean = GetAllUsers(); 
    Boolean isRegistered = true; 
    final ComplexResult result = new ComplexResult(bean, isRegistered); 

    return Response.ok().entity(Entity.json(result)).build(); 
} 

...のように見えます、しかし、あなたの応答文書がようをどうあるべきかです。ラッパーのための単一の応答文書しか持てません。ラッパーのシリアル化方法は、文書の各部分へのアクセス方法に影響します。

注 - あなたのリソースはXMLとJSONの両方を生成できるものとしてリストされていますが、私が行ったことはjsonでしか機能しません。あなたは、フレームワークがあなたのためのすべてのコンテンツネゴシエーション重労働を行うために取得することができ、そしてそれはおそらく...ちょうどResponseではなく、メソッドからドキュメントタイプを返すことによって、

public ComplexResponse getAllUsers() { 
    ... 
    return new ComplexResult(bean, isRegistered); 
+0

詳細な回答ありがとうございます! :) – Dinuka

関連する問題