Spring Data RESTでのHTTPエンドポイントのカスタマイズ

データ]

1.はじめに

Spring Data RESTは、RESTサービスにとって自然な多くの定型句を削除することができます。

このチュートリアルでは、Spring Data RESTのHTTPバインディングのデフォルトのいくつかをカスタマイズする方法を探ります。

2. Spring Data RESTリポジトリの基礎

まず始めに、エンティティの型とその主キーの型を指定して、 CrudRepository インタフェースを拡張する空のインタフェースを作成しましょう。

public interface UserRepository extends CrudRepository<WebsiteUser, Long> {}

デフォルトでは、 Springは必要なすべてのマッピング を生成し、適切なHTTPメソッドを介してアクセス可能になるように各リソースを設定し、適切なステータスコードを返します。

CrudRepository で定義されているすべてのリソースが必要ない場合は、基本的な Repository インターフェースを拡張し、必要なリソースのみを定義することができます。

public interface UserRepository extends Repository<WebsiteUser, Long> {
  void deleteById(Long aLong);
}

リクエストを受け取ると、 Springは使用されているHTTPメソッドを読み取り、リソースタイプに応じて、存在する場合はインターフェイス で定義されている適切なメソッドを呼び出すか、それ以外の場合はHTTPステータス 405(Method Not Allowed) を返します。

上記のコードを参照すると、SpringはDELETEリクエストを受け取ると、 deleteById メソッドを実行します。

3.公開するHTTPメソッドを制限する

ユーザー管理システムがあるとしましょう。私たちは、__UserRepositoryを持っているかもしれません。

そして、私たちはSpring Data RESTを使っているので、それを CrudRepository を拡張することから多くを得ます:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends CrudRepository<WebsiteUser, Long> {}
  • すべてのリソースはデフォルトのCRUDパターン** を使用して公開されているので、次のコマンドを発行します。

curl -v -X DELETE http://localhost:8080/users/<existing__user__id>

削除を確認するために、HTTPステータス 204(コンテンツが返されませんでした) が返されます。

それでは、 delete メソッドを内部的に使用しながら第三者から隠したい** としましょう。

次に、最初に deleteById メソッドシグネチャをインターフェイスに追加します。これにより、設定することをSpring Data RESTに通知します。

それから、アノテーション @ RestResource(export = false) を使用することができます。これは、HTTPメソッドを公開するときにこのメソッドをスキップするようにSpringを設定します。

@Override
@RestResource(exported = false)
void deleteById(Long aLong);

上記と同じ cUrl コマンドを繰り返すと、代わりにHTTPステータス 405(Method Not Allowed) が表示されます。

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

@ RestResource アノテーションはまた、 リポジトリメソッドにマッピングされたURLパス およびhttps://www.baeldung.com/spring-hateoas-tutorial[HATEOAS]によって返されるJSON内のリンクIDをカスタマイズすることもできます。リソースの発見

そのためには、アノテーションのオプションのパラメータを使います。

URLパスの path **

リンクIDは rel **

UserRepository に戻って、簡単な findByEmail メソッドを追加しましょう。

WebsiteUser findByEmail(@Param("email") String email);

http://localhost:8080/users/search/ に対して cUrl を実行すると、新しいメソッドが他のリソースと共に表示されるようになります。

{
  "__links": {
    "findByEmail": {
      "href": "http://localhost:8080/users/search/findByEmail{?email}"
    },
    "self": {
      "href": "http://localhost:8080/users/search/"
    }
  }
}
  • デフォルトのパスが気に入らない場合は、リポジトリメソッドを変更するのではなく、単に @ RestResource アノテーションを追加するだけです。

@RestResource(path = "byEmail", rel = "customFindMethod")
WebsiteUser findByEmail(@Param("email") String email);

また、リソースの発見をもう一度行うと、結果のJSONによって変更が確認されます。

{
  "__links": {
    "customFindMethod": {
      "href": "http://localhost:8080/users/search/byEmail{?email}",
      "templated": true
    },
    "self": {
      "href": "http://localhost:8080/users/search/"
    }
  }
}

5.プログラムによる設定

HTTPメソッドへのアクセスを公開または制限するために、より詳細なレベルの設定が必要になることがあります。たとえば、コレクションリソースに対するPOST、アイテムリソースに対するPUTおよびPATCHはすべて同じ save メソッドを使用します。

  • Spring Data REST 3.1から始まり、Spring Boot 2.1で利用可能 特定のHTTPメソッドの公開を** __ExposureConfiguration __classを通して変更できます。この特定の設定クラスは、グローバルルールとタイプベースルールの両方を定義するためのラムダベースのAPIを公開します。

たとえば、 UserRepository に対するPATCH要求を制限するために __ExposureConfiguration __を使用できます。

public class RestConfig implements RepositoryRestConfigurer {
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration restConfig) {
        ExposureConfiguration config = restConfig.getExposureConfiguration();
        config.forDomainType(WebsiteUser.class).withItemExposure((metadata, httpMethods) ->
          httpMethods.disable(HttpMethod.PATCH));
    }
}

6.まとめ

この記事では、Spring Data RESTを構成して、リソースでデフォルトでサポートされているHTTPメソッドをカスタマイズする方法について説明しました。

いつものように、この記事で使われている例は私達のhttps://github.com/eugenp/tutorials/tree/master/spring-data-rest[GitHubプロジェクト]にあります。