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 のサポートを無効にします。 |