1

プロジェクト用のRESTfulAPIの作成に取り組んでいます。ジャージで実装しようとすると、いくつかの問題が発生します。

  1. 私のオブジェクトモデルには明らかにuri情報が含まれていません。たとえば、Fruitクラスがあるとします。Fruitオブジェクトは、FruitNameとFruitColorとしましょう。しかし、応答では、URIも送信する必要があります。これは通常どのように処理されますか?「Fruit」を取得し、そこからURIを含む完全なリソースを作成するコンストラクターを持つ別の「FruitResource」を作成する必要がありますか?ネストされたオブジェクトにもURIが必要です。たとえば、オブジェクトのリストを返す場合は、ChildChildオブジェクトにもURIが必要ですが、URIをオブジェクトモデルの一部にしたくありません。これを行う最もクリーンな方法は何ですか?

  2. 同じリソースの完全なビューと部分的なビューを返す機能が必要です。部分ビューには、たとえば名前とURIだけが含まれます。これを行う方法は?

現在私が持っているのServiceは、リクエストを受け入れるクラスです。これはDAO、DBからモデル化され、jacksonを使用してJSONにシリアル化されたオブジェクトを作成し、返すためにを使用します。

4

4 に答える 4

2

JaxB クラスを使用する方法があり、Object Model を JaxB クラスに渡すことができ、JaxB クラスは URI を生成します。以下は小さな試作品です。

UserResource クラス

@Path("/user")
public class UserResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{user-id}")
public UserJaxB getUser(@PathParam("user-id") String userId, @Context
HttpServletRequest request) {
    // now XYZ is hard-coded value 
    String serviceEndpoint = request.getContextPath() + "/" + "user";
    UserModel userModel = new UserModel(userId, "XYZ");
    return new UserJaxB(serviceEndpoint,userModel);
}
}

ユーザー JAXB クラス

@XmlRootElement
public class UserJaxB {

private String name;
private String id;
private String serviceEndpoint;
private String URI;

public UserJaxB(String serviceEndpoint, UserModel userModel) {
    this.name = userModel.getName();
    this.id = userModel.getId();
    this.serviceEndpoint = serviceEndpoint;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getURI() {
    return this.serviceEndpoint + "/" + id;
}
}

ユーザー モデル クラス public class UserModel {

String name;
String id;

public UserModel(String name, String id) {
    this.name = name;
    this.id = id;
}

public String getId() {
    return id;
}


public String getName() {
    return name;
}
}
于 2012-09-07T18:33:54.943 に答える
2

私は、これらの懸念の両方をサポートするプロジェクトに取り組んでいます: https://github.com/skyscreamer/yogaデモを含む詳細情報はhttp://yoga.skyscreamer.org/にあります。

これは、JAX-RS (または Spring MVC) レンダリング メカニズムを、REST システムのニーズにより適合したカスタム ビルド ソリューションに置き換えます。

#1 には、Child pojo に適用する必要があるアノテーションがあります。JAX-RS のアノテーションは、URL を基になるオブジェクトではなくコントローラーにマップすることを意図しているため、カスタム ソリューションが必要でした... しかし、実際には、pojo ごとに 1 つの追加のアノテーションになります。

#2 については、pojo または pojo の子から必要な追加情報を指定する URL ベースのメカニズムがあります (さらにネストすることもできます)。

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

于 2012-09-07T18:48:37.057 に答える
1

1)これをサポートするJerseyまたはJAX-RSメカニズムを知りません。ただし、各ドメイン クラスのコンストラクターに URI を追加する必要があるのは悪い習慣のように思えます。メソッドをインターセプトし、応答を新しいオブジェクトにラップするアスペクトを作成できます。リソースの URI をラッパーに追加します (インターセプターからのリフレクションを介して URIInfo を取得できます)。etag サポートを構築するときにこれを行ったので、すべての応答にキャッシュ コードを追加する必要はありません。子URIの問題を処理するために、同じ側面に何かを追加することもできると思います...

次の議論も参照してください。

2)「より軽い」応答エンティティを構築するために、私は通常BeanLite.class、要約に必要なプロパティだけを持ち、Bean.classそれをより詳細に拡張します。両方を ORM に追加して、DAO で表現を切り替えるオプションを提供できます。

于 2012-09-07T18:37:09.797 に答える
0

ご回答ありがとうございます。皆さんが提示したすべてのアプローチを検討し、私自身で少し調査した後、これが私が解決したものです:

1) オブジェクト モデルの一部として uri を追加しています。これは、現在私にとって最もクリーンなソリューションのようです。URI は、オブジェクトが作成されるたびに (オブジェクトの他のプロパティを使用して) 自動的に設定されます。以前はこれは悪い考えだと思っていましたが、オブジェクトと共に移動し続ける必要がある余分なフィールド以外に、このアプローチの問題を予見することはできません。

2)全体/部分ビューをサポートするために、@JsonView注釈を使用しようとしています。これは良いアプローチのようです。

この処理方法に他に潜在的な問題があるかどうか教えてください。

于 2012-09-09T13:55:57.547 に答える