47

バージョン 2.0.2.RELEASE の JPA で Spring Data REST を使用する。

JSON で Hypertext Application Language (HAL) を無効にするにはどうすればよいですか? http://stateless.co/hal_specification.html

私はすでに多くのことを試しましたが、役に立ちませんでした。たとえば、Accept ヘッダーと Content-type ヘッダーを "application/hal+json" ではなく "application/json" に設定しましたが、まだハイパー リンク付きの JSON コンテンツを受け取ります。

たとえば、次のようなものを取得したいと思います。

{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"sector" : {
     "description" : "Marketing",
     "average profit": 545656665,
     "average employees": 75,
     "average profit per employee": 4556
     }
}

それ以外の:

{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"_links" : {
     "self" : {
          "href" : "http://localhost:8080/app/companies/1"
     },
     "sector" : {
          "href" : "http://localhost:8080/app/companies/1/sector"
     }
}
}

ご協力いただきありがとうございます。

4

2 に答える 2

42

(ハイパー) メディアの種類

Spring Data REST のデフォルト設定では、デフォルトのハイパーメディア表現形式として HAL を使用するため、サーバーは指定されたAcceptヘッダーに対して以下を返します。

  • ヘッダーなし -> application/hal+json-> HAL
  • application/hal+json-> application/hal+json-> HAL
  • application/json-> application/json-> HAL (これがデフォルトの設定です)
  • application/x-spring-data-verbose+json-> application/x-spring-data-verbose+json-> Spring Data 固有の形式 (linksリンク コンテナーに使用しcontent、コレクション アイテムのラッパーとして使用します。

RepositoryRestConfiguration.setDefaultMediaType(…)非 HAL 形式に構成すると、明示的に要求しない限り、サーバーは Spring Data 固有の JSON 形式を返しますapplication/hal+json。確かに、構成オプションはおそらく少し誤解を招く可能性があるため、これを改善するためにDATAREST-294を提出しました。この問題は 2.1 RC1 (Dijkstra) 2014 で解決されました。

管理されたリソース間の関係を表現し、サーバーの発見可能性を有効にするには、ハイパーメディア形式が必要であることに注意してください。そのため、完全に取り除くことはできません。これは主に、双方向の関係を持つエンティティを公開したり、巨大なオブジェクト グラフを構成したりすると、サーバーが簡単にクラッシュする可能性があるためです。

関連エンティティのインライン化

セクターをリンクさせずに常にインライン化したくない場合、1 つのオプションはSectorRepository、最初に REST リソースとしてエクスポートされないようにすることです。これは、リポジトリ インターフェイスに で注釈を付けることで実現できます@RepositoryRestResource(exported = false)

下の例に投稿したときに返される表現を取得するには、Spring Data REST 2.1 M1 で導入されたプロジェクション機能をご覧ください。基本的に、シンプルなインターフェイスを介して、デフォルトのビューとは異なるリソースのオプションのビューを作成できます。

基本的にインターフェースを定義します:

@Projection(name = "foo", types = YourDomainClass.class)
interface Inlined {

  // list all other properties

  Sector getSector();
}

このインターフェイスをドメイン クラスの (サブ) パッケージに入れるか、RepositoryRestConfiguration.projectionConfiguration()公開するリソースを介して手動で登録するYourDomainClassと、リクエスト パラメータが受け入れられるprojectionため、この例で渡すとfooインライン表現が必要に応じてレンダリングされます。

このコミットには、一般的な機能に関する詳細情報があり、このコミットにはプロジェクションの例が定義されています。

于 2014-04-25T07:52:42.497 に答える