24

HATEOASを使用して Spring MVC 3.x RESTful サービスを実装する正しい方法に苦労しています。次の制約を考慮してください。

  • ドメイン エンティティが web/rest 構造で汚染されるのは望ましくありません。
  • コントローラーがビュー コンストラクトで汚染されるのは望ましくありません。
  • 複数のビューをサポートしたい。

現在、私はHATEOASなしでMVCアプリをうまくまとめています。ドメイン エンティティは、ビューや Web/REST の概念が組み込まれていない純粋な POJO です。例えば:

class User {
   public String getName() {...}
   public String setName(String name) {...}
   ...
}

私のコントローラーもシンプルです。それらはルーティングとステータスを提供し、Spring のビュー解決フレームワークに委譲します。私のアプリケーションは JSON、XML、および HTML をサポートしていますが、ドメイン エンティティまたはコントローラーにビュー情報が埋め込まれていないことに注意してください。

@Controller
@RequestMapping("/users")
class UserController {

  @RequestMapping
  public ModelAndView getAllUsers() {
    List<User> users = userRepository.findAll();
    return new ModelAndView("users/index", "users", users);
  }

  @RequestMapping("/{id}")
  public ModelAndView getUser(@PathVariable Long id) {
    User user = userRepository.findById(id);
    return new ModelAndView("users/show", "user", user);
  }
}

だから、今私の問題 - HATEOAS をサポートするクリーンな方法がわかりません。これが例です。クライアントが JSON 形式のユーザーを要求すると、次のようになります。

{
  firstName: "John",
  lastName: "Smith"
}

また、HATEOAS をサポートする場合、クライアントがオブジェクトの更新、削除などに使用できる単純な「自己」リンクを JSON に含めたいとします。また、ユーザーの友達リストを取得する方法を示す「友達」リンクがある場合もあります。

{
  firstName: "John",
  lastName: "Smith",
  links: [
    {
      rel: "self",
      ref: "http://myserver/users/1"
    },
    {
      rel: "friends",
      ref: "http://myserver/users/1/friends"
    }
  ]
}

どういうわけか、オブジェクトにリンクを付けたいと思っています。コントローラーはすべて正しい URL を知っているため、これを行うのに適切な場所はコントローラー層だと思います。さらに、私は複数のビューをサポートしているので、Spring のビュー解決フレームワークで JSON/XML に変換する前に、コントローラーでドメイン エンティティを何らかの形で装飾するのが正しいと思います。これを行う 1 つの方法は、問題の POJO を、リンクのリストを含む汎用の Resource クラスでラップすることです。必要な形式に変換するには、ビューを微調整する必要がありますが、実行可能です。残念ながら、ネストされたリソースをこの方法でラップすることはできませんでした。頭に浮かぶ他のことには、ModelAndView へのリンクの追加、および生成された JSON/XML などにリンクを詰め込むための Spring のすぐに使えるビュー リゾルバーのそれぞれのカスタマイズが含まれます。私がしないこと 必要なのは、JSON/XML などを常に手作りすることです。開発中に出入りするさまざまなリンクに対応します。

考え?

4

4 に答える 4

10

GitHub にSpring HATEOASという便利なプロジェクトがあり、次の説明があります。

「このプロジェクトは、Spring、特に Spring MVC を操作する際に、HATEOAS 原則に従う REST 表現の作成を容易にする API を提供します」

返すリソース クラスが 'ResourceSupport' を拡張する場合、簡単にリンクを追加でき、'ControllerLinkBuilder' を使用してリンクを作成できます。たとえば、自己リンクを追加します。

import static org.sfw.hateoas.mvc.ControllerLinkBuilder.*;

Link link = linkTo(YourController.class).slash(resource.getName()).withSelfRel();
resource.add(link);

これは非常に新しいプロジェクトですが、必要に応じてパブリック Maven リポジトリから入手できます。

<dependency>
    <groupId>org.springframework.hateoas</groupId>
    <artifactId>spring-hateoas</artifactId>
    <version>0.3.0.RELEASE</version>
</dependency>

Maven アーティファクトを使用する場合:

org.sfw.hateoas.mvc.ControllerLinkBuilder

になります:

org.springframework.hateoas.mvc.ControllerLinkBuilder
于 2012-11-30T11:02:24.850 に答える
1

私の考え:

  • たとえば、オブジェクトのクラス名から自己参照URLを構築できるように、ある種の命名規則を使用します。
  • リンクの追加はコントローラーによって追加されるべきではないと思います(ところで、「コントローラーがビュー構造で汚染されたくない」と自分で書いたのです。JSONシリアル化を拡張してJSONシリアル化を拡張する方法を探してみます余分なものを自動的に追加します。エンティティを少し汚染する場合でも、エンティティに注釈を追加する必要がある場合があります。
于 2011-08-24T05:54:21.397 に答える
1

何か他のものを探しているときにこれに出くわし、実際にはリソースの表現を汚染している JSON 本文のコンテンツの代わりに Link ヘッダーを使用することを検討する必要があると考えました。

Web リンクに関する IETF のメモと、リンク関係の IANA レジストリも確認してください。

于 2012-08-15T11:35:38.867 に答える
0

APIでリンクを作成するには、Spring フレームワークのプロジェクトをREST使用できます。HAETOAS

org.springframework.hateoas.mvc.ControllerLinkBuilderクラスには、次のようなリンクを構築するために使用できる一連のメソッドがあります-

Link link=linkTo(PersonControllerImpl.class).slash(null).withSelfRel();

@RequestMappingまた、何らかのURI値を持つアノテーションを持つコントローラーメソッドがある場合-

@RequestMapping(value = "/customer", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<?> getCustomer() {

//...
}

次に、メソッドURI値を次のように使用してリンクを作成できます-

linkTo(methodOn(PersonControllerImpl.class).getCustomer()).toUri().toString()

で設定できるString値( )を返します。http://www.urhost.com/customerentity Object

于 2016-09-19T11:17:59.027 に答える