web-dev-qa-db-ja.com

Spring Data RESTアイテムリソースに抜粋プロジェクションが自動的に適用されないのはなぜですか?

ネストされたエンティティを公開する投影を作成しました。

@Projection(name = "inlineBusiness", types = { UserModel.class })
public interface InlineBusinessUserModelProjection {

    String getUsername();

    String getFirstName();

    String getLastName();

    Date getBirthdate();

    String getEmail();

    BusinessModel getBusiness();
}

そしてサービスリポジトリ:

@RepositoryRestResource(collectionResourceRel = "users", path = "users",
       excerptProjection = InlineBusinessUserModelProjection.class)
public interface UserRepository extends BaseDAO<UserModel> {..}

/usersの場合、正常に機能し、ビジネスフィールドはネストされたエンティティで公開されますが、/users/1-を呼び出すと、すべてのカスタムメソッドも含まれません。プロジェクションは、 /users何かアイデアはありますか?

19
nKognito

それは設計どおりに機能します。 __embedded_句内でターゲットタイプ(この場合はUserModel)のインスタンスが使用される場合は常に、抜粋​​プロジェクションが使用されます。したがって、抜粋は、リソース自体がレンダリングされていないがポイントされているすべての場所で使用されるある種のプレビューです。これは通常、コレクションリソースまたはアソシエーションの場合です。

アイテムリソースでデフォルトで抜粋プロジェクションを使用することは、別の観点からは実際には意味がありません。抜粋プロジェクションは、一部のドメインオブジェクトでの読み取り専用ビューです。デフォルトでアイテムリソースのビューを返す場合、クライアントはリソースを更新するために送信する必要のあるデータをどのように知ることができますか。抜粋プロジェクション用に作成されたJSONドキュメントは、定義上、単純に取得、変更、およびリソースを更新するためのPUTリクエストの送信に使用することはできません。

アイテムリソースにプロジェクションを適用する場合は、projectionURIテンプレート変数にプロジェクションの名前を入力します。

編集:手動で投影を選択しても投影が適用されない場合は、InlineBusinessUserModelProjectionが実際に一般的な使用のために登録されていることを確認してください。 タイプがUserModelとまったく同じパッケージまたはサブパッケージにあることを確認してください。または、RepositoryRestConfiguration.projectionConfiguration().addProjection(…)。手動構成では、廃止されたプロジェクションタイプで_@Projection_を使用します。

このトピックの詳細については、 Spring Data RESTリファレンスドキュメント

33
Oliver Drotbohm