3

JAX-RS アプリケーションのメソッドがドメイン オブジェクトを返す場合、表現 (JSON など) にはこのオブジェクトのすべての属性が含まれます。しかし、このオブジェクトに Web に公開すべきではない「プライベート」データが含まれている場合はどうなるでしょうか。

また、外部から内部への別の方向性についてはどうでしょうか: プライベート フィールドがオーバーライドされるのをどのように防ぐことができるでしょうか?

これに対する唯一の解決策は、データ転送オブジェクト (dto) を作成することです。

マップするフィールドを指定できない場合を除き、「 automapper 」を使用しても解決にはなりません。

では、JAX-RS は開発者に DTO の作成を強制するのでしょうか? それとも別の解決策がありますか?

4

3 に答える 3

3

エンティティの XML との間での透過的なマーシャリングとアンマーシャリングを行うには、JAXB アノテーションを付けます (クラスには JPA と JAXB の両方のアノテーションを付けることができ、この方法で XML 表現を提供し、データベースに永続化できます)。

@Entity
@XmlRootElement
public class MyEntity implements Serializable {

    @Id @GeneratedValue
    private Long id;

    ....

}

上記の例では、JAXB アノテーションを 1 つだけ使用しています@XmlRootElementidここで、シリアル化された XMLにプロパティが必要ないとします。JAXB アノテーション@XmlTransientを追加するだけです。

@Entity
@XmlRootElement
public class MyEntity implements Serializable {

    @XmlTransient
    @Id @GeneratedValue
    private Long id;

    ....

}

したがって、いいえ、DTO (およびそれらをエンティティとの間でマッピングするボイラープレート コード) は厳密には必要ありません。

于 2010-01-13T14:34:33.740 に答える
2

JAX-RS では表現を使用する必要があると言ったほうがよいと思います。

私の Foo ドメイン オブジェクトは、それが RESTful な方法で使用されていることを認識していません。バー (別の集約ルート) と、そのバーを介してナビゲートできるエンティティのみを認識します。実際、REST も HTTP も使用しない、このアプリケーションへのコマンドライン インターフェイスもあります。

私の RESTful インターフェイスは、URI を介して相互にリンクする表現に Foo/Bar をラップします。これらのDTOを呼び出すことができると思いますが、(他の回答で述べたように)ドメインモデルにマーシャリングとアンマーシャリングに必要なものを注釈するだけであれば、HATEOASを禁止するコーナーに自分自身をコーディングしていると思います.

これは、コレクションがある場合にも明らかです。Foo->*Bar の場合、すべての Bar アイテムをマーシャリングされていない形式で返しますか? URIだけでなく、他の最小限のデータではないのはなぜですか。

GET foo/fff

<foo>
  <link rel="self" uri="uri="foo/fff" />
  <bar uri="bar/abc123">
    <status="Active" />
  </bar>
  <bar uri="bar/qqq">
    <status="Inactive" />
  </bar>
</foo>

クライアントが特定のバーについてもっと知りたい場合は、

bar/abc123 を取得

<bar>
  <link rel="self" uri="bar/abc123" />
  <foo uri="foo/fff" />
  <status>Active</status>
  <title>Some Bar</title>
  ...
</bar>
于 2011-08-25T18:33:10.140 に答える
1

@XmlTransient(または対応するアノテーション) は、シリアル化された出力にアノテーション付きのプロパティを含めないようにマッパー/マーシャラーに指示します。

于 2010-01-13T12:41:32.780 に答える