現在、次のように@RepositoryRestResourceでアノテーションを付けることにより、いくつかのSpring DataRepositoryをRESTfulサービスとして公開しています。
@RepositoryRestResource(collectionResourceRel = "thing1", path = "thing1")
public interface Thing1Repository extends PagingAndSortingRepository<Thing1, String> {}
@RepositoryRestResource(collectionResourceRel = "thing2", path = "thing2")
public interface Thing2Repository extends CrudRepository<Thing2, String> {}
これはすべてうまく機能します。最初のエンドポイントに到達すると、次のように、公開したすべてのSpringデータリポジトリも表示されます。
{
_links: {
thing1: {
href: "http://localhost:8080/thing1{?page,size,sort}",
templated: true
},
thing2: {
href: "http://localhost:8080/thing2"
}
}
}
これで、Spring Data Repositoriesで表すことができない、公開したいエンドポイントがいくつかあるので、RestControllerを使用しています。
簡単な例を次に示します。
@RestController
@ExposesResourceFor(Thing3.class)
@RequestMapping("/thing3")
public class Thing3Controller {
@Autowired
EntityLinks entityLinks;
@Autowired
Thing3DAO thing3DAO;
//just assume Thing3.class extends ResourceSupport. I know this is wrong, but it makes the example shorter
@RequestMapping(value = "/{id}", produces = "application/json")
Thing3 thing3(@PathVariable("id") String id)
{
Thing3 thing3 = thing3DAO.findOne(id);
Link link = entityLinks.linkToSingleResource(Thing3.class, id);
thing3.add(link);
return thing3;
}
}
このアプリを実行して次の場所に移動すると、次のようになります。
http://localhost:8080/thing3/{id}
Thing3のJSON表現とそれ自体へのリンクを取得します。これは期待どおりに機能します。
私がどのように行うかを理解したいのは、最初のエンドポイントにもこのコントローラーを記述させることです。私は基本的にこれが欲しい:
{
_links: {
thing1: {
href: "http://localhost:8080/thing1{?page,size,sort}",
templated: true
},
thing2: {
href: "http://localhost:8080/thing2"
},
thing3: {
href: "http://localhost:8080/thing3"
}
}
}
ベースエンドポイントにこのコントローラーへのリンクを設定するには、何をする必要がありますか?
RepositoryLinkResourceをオーバーライドして、thing3を指すリソースを追加できます。
resource.add(ControllerLinkBuilder.linkTo(Thing3Controller.class).withRel("thing3"));
この質問を確認してください: Spring内のルートリクエストに対するカスタム応答REST RepositoryRestResource-sと通常のコントローラーの両方を使用したHATEOAS