Spring Data REST のカスタマイズ

Spring Data REST をカスタマイズするための多くのオプションがあります。これらのサブセクションは、その方法を示しています。

アイテムリソース URI のカスタマイズ

デフォルトでは、アイテムリソースの URI は、コレクションリソースに使用されるパスセグメントにデータベース識別子が追加されたもので構成されます。これにより、リポジトリの findOne(…) メソッドを使用してエンティティインスタンスを検索できます。Spring Data REST 2.5 の時点で、これは RepositoryRestConfiguration (Java 8 で推奨) で構成 API を使用するか、アプリケーションで Spring Bean として EntityLookup の実装を登録することでカスタマイズできます。Spring Data REST はそれらをピックアップし、実装に従って URI 生成を微調整します。

User を一意に識別する username プロパティを持つ User を想定します。さらに、対応するリポジトリに Optional<User> findByUsername(String username) メソッドがあると仮定します。

Java 8 では、次のように、マッピングメソッドをメソッド参照として登録して URI の作成を微調整できます。

@Component
public class SpringDataRestCustomization implements RepositoryRestConfigurer {

  @Override
  public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.withEntityLookup()
      .forRepository(UserRepository.class)
      .withIdMapping(User::getUsername)
      .withLookup(UserRepository::findByUsername);
  }
}

forRepository(…) は、最初の引数としてリポジトリ型、2 番目の引数としてリポジトリドメイン型を特定のターゲット型にマッピングするメソッドリファレンス、最初の引数としてメンションされたリポジトリを使用してその値をマッピングする別のメソッドリファレンスを取ります。

Java 8 以上を実行していない場合は、このメソッドを使用できますが、非常に冗長な匿名内部クラスがいくつか必要になります。古い Java バージョンでは、次のような UserEntityLookup を実装することをお勧めします。

@Component
public class UserEntityLookup extends EntityLookupSupport<User> {

    private final UserRepository repository;

    public UserEntityLookup(UserRepository repository) {
        this.repository = repository;
    }

    @Override
    public Serializable getResourceIdentifier(User entity) {
        return entity.getUsername();
    }

    @Override
    public Object lookupEntity(Serializable id) {
        return repository.findByUsername(id.toString());
    }
}

getResourceIdentifier(…) が URI 作成で使用されるユーザー名を返す方法に注目してください。そのメソッドから返された値でエンティティインスタンスをロードするために、UserRepository で使用可能なクエリメソッドを使用して lookupEntity(…) を実装するようになりました。

リポジトリの公開のカスタマイズ

デフォルトでは、リポジトリリソースに従って、すべてのパブリック Spring Data リポジトリが HTTP リソースを公開するために使用されます。パッケージで保護されたリポジトリインターフェースは、その機能がパッケージの内部でのみ表示されることを表すため、このリストから除外されます。これは、RepositoryRestConfiguration で RepositoryDetectionStrategy を明示的に(通常は列挙型 RepositoryDetectionStrategies を介して)設定することでカスタマイズできます。次の値を構成できます。

  • ALL — Java の可視性やアノテーションの構成に関係なく、すべての Spring Data リポジトリを公開します。

  • DEFAULT — パブリック Spring Data リポジトリ、または @RepositoryRestResource とその exported 属性が false に設定されていないことで明示的にアノテーションが付けられたリポジトリを公開します。

  • VISIBILITY — アノテーションの構成に関係なく、パブリック Spring Data リポジトリのみを公開します。

  • ANNOTATED —  @RepositoryRestResource で明示的にアノテーションが付けられた Spring Data リポジトリと、false に設定されていないその exported 属性のみを公開します。

適用するカスタムルールが必要な場合は、RepositoryDetectionStrategy を手動で実装するだけです。

サポートされている HTTP メソッドのカスタマイズ

デフォルトの露出のカスタマイズ

デフォルトでは、Spring Data REST は、リポジトリが公開する CRUD メソッドに基づいて、リポジトリリソースで説明されている HTTP リソースとメソッドを公開します。リポジトリは CrudRepository を継承する必要はありませんが、前述のセクションで説明されているメソッドを選択的に宣言することもでき、リソースの公開が続きます。例: リポジトリが delete(…) メソッドを公開していない場合、アイテムリソースに対して HTTP DELETE はサポートされません。

内部で使用するメソッドを宣言する必要があるが、HTTP メソッドの公開をトリガーしたくない場合は、リポジトリメソッドに @RestResource(exported = false) アノテーションを付けることができます。リポジトリリソースで説明されている HTTP メソッドのサポートを削除するために、そのようにアノテーションを付けるメソッド。

メソッドレベルでの露出の管理が十分にきめ細かいものではない場合があります。例: save(…) メソッドは、コレクションリソースの POST、およびアイテムリソースの PUT と PATCH をバックアップするために使用されます。公開する必要のある HTTP メソッドを選択的に定義するには、RepositoryRestConfiguration.getExposureConfiguration() を使用できます。

このクラスは、Lambda ベースの API を公開して、グローバルルールと型ベースのルールの両方を定義します。

ExposureConfiguration config = repositoryRestConfiguration.getExposureConfiguration();

config.forDomainType(User.class).disablePutForCreation(); (1)
config.withItemExposure((metadata, httpMethods) -> httpMethods.disable(HttpMethod.PATCH)); (2)
1 アイテムリソースを直接作成するための HTTP PUT のサポートを無効にします。
2 すべてのアイテムリソースで HTTP PATCH のサポートを無効にします。