データ]

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プロジェクト]にあります。