2016-07-19 6 views
4

私はSpringデータREST 2.5.1、Jackson 2.8.0、Spring Boot 1.3.6を使用しています。SpringデータREST - Java HATEOASクライアントのエンティティリストを消費

私はRestTemplate経由でリポジトリから簡単なエンティティのリストを取得しようとしています。私はブラウザでエンドポイントに到達し、期待されるHALデータを得ることができます。単一のエンティティを取得するには、次のようにうまく動作します。これらはすべてデフォルトのSDRエンドポイント(例:localhost:{port}/myEntity)を使用しています。

ResponseEntity<Resource<MyEntity>> responseEntity = 
    new RestTemplate() 
     .exchange(
     uri + "/1", 
      HttpMethod.GET, 
      HttpEntity.EMPTY, 
     new ParameterizedTypeReference<Resource<MyEntity>>() {}, port 
     ) 

それとも 新しいRestTemplate()。getForEntity(URI + "/ 1"、MyEntity.class、ポート)

SOの質問の多くは、リストを取得された例を見つけ、示すように見えると問題。私はParameterizedTypeReferenceResourcesResourceMyEntity、配列、リストを試しました。すべて運がない。

 ResponseEntity<Resources<Resource<MyEntity>>> responseEntity = 
      new RestTemplate() 
        .exchange(
        uri, 
        HttpMethod.GET, 
        HttpEntity.EMPTY, 
        new ParameterizedTypeReference<Resources<Resource<MyEntity>>>() {} 
      , port 
      ) 

などResourcesResourceList<MyEntity>MyEntity、任意の種々のほとんどを上記のように呼び出された場合、ResponseEntityは空です。 Like:

<200 OK,Resources { content: [], links: [] },{Server=[Apache-Coyote/1.1], Content-Type=[application/json;charset=UTF-8], Transfer-Encoding=[chunked], Date=[...]}> 

文字列JSONはブラウザでは以下のようになります。

{ 
"_embedded" : { 
"myEntities" : [ ... ] 
}, 
"_links" : { 
"self" : { 
    "href" : "http://localhost:8080/myEntity" 
}, 
"profile" : { 
    "href" : "http://localhost:8080/profile/myEntity" 
}, 
"search" : { 
    "href" : "http://localhost:8080/myEntity/search" 
} 
}, 
"page" : { 
    "size" : 20, 
    "totalElements" : 10, 
    "totalPages" : 1, 
    "number" : 1 
} 
} 

リポジトリの定義:私が行方不明です何に

@RepositoryRestResource(collectionResourceRel = "myEntities", path = "myEntity") 
public interface MyEntityRepository extends PagingAndSortingRepository<MyEntity, Long> 
, QueryDslPredicateExecutor<MyEntity> 
, QuerydslBinderCustomizer<QMyEntity> { } 

任意の考え?

+0

「リソース」の構造を見ると、JSONドキュメントの構造とは異なることがわかります。それはあなたの車の鍵であなたの家を開こうとするようなものです。 – zeroflagL

+0

ええ、私は努力している方法が機能していないことを知っています。私は働いているものを見つけようとしています。 SDRがこのフォーマットを作成している場合、それを消費する予定のSpringクラスが存在する必要があります。私は標準的なフォーマットのために私自身をロールバックする必要はありません。 – JudgingNotJudging

+1

あなたの例の文書の基礎は 'PagedResources'です。 '_embedded'は' EmbeddedWrapper'に依存します。しかし、ドキュメントを直接表現するクラスはありません。 '_embedded'プロパティが動的なので、ドキュメントは動的に構築されます。 – zeroflagL

答えて

5

私はいくつかのことを行うことでこれを解決しました。

  1. 私はspring-hateoas:0.20.0.RELEASEを0.19.0に更新する必要がありました。 spring-hateoas:0.19.0はjackson 2.7+を指定されたhereとしてサポートしませんでした。

  2. 下記のようにClientを更新しました。

    ObjectMapper mapper = builder.build() 
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); 
    
    messageConverter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json")) 
    messageConverter.setObjectMapper(mapper) 
    
    ResponseEntity<PagedResources<MyEntity>> responseEntity = 
         new RestTemplate(Arrays.asList(messageConverter)) 
           .exchange(
           uri, 
           HttpMethod.GET, 
           HttpEntity.EMPTY, 
           new ParameterizedTypeReference<PagedResources<MyEntity>>() {}, port 
         ) 
    

PagedResourcesは次のようになります。

<200 OK,PagedResource { content: [{<List of MyEntities>}], metadata: Metadata { number: 0, total pages: 1, total elements: 10, size: 20 }, links: [<List of hateoas links for MyEntities>] },{Server=[Apache-Coyote/1.1], Content-Type=[application/hal+json;charset=UTF-8], Transfer-Encoding=[chunked], Date=[Thu, 21 Jul 2016 14:57:18 GMT]}> 

zeroflagLさんのコメント@私は最終的につながっPagedResources実装、でより密接に見てしまった 'なるほど!'このblogの瞬間。

デフォルトのRestTemplateでは、受け入れヘッダーがapplication/hal+jsonに設定されていません。代わりに、デフォルトはapplication/x-spring-data-compact+json;charset=UTF-8で、内容とリンクのみを持ちます。これが私のResourcesタイプの空のコンテンツを取得した理由です。上記のようにMediaTypeを明示的に設定すると、問題が解決されました。

関連する問題