Spring 数据 REST - 使用实体列表,Java HATEOAS 客户端
Spring Data REST - Consume List of Entities, Java HATEOAS client
我正在使用 Spring Data REST 2.5.1,Jackson 2.8.0,Spring Boot 1.3.6。
我正在尝试通过 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, port)
正如许多 SO 问题似乎表明的那样,找到检索列表的示例是一个问题。我试过 ParameterizedTypeReference
与 Resources
、Resource
、MyEntity
、数组、列表。都没有运气。
ResponseEntity<Resources<Resource<MyEntity>>> responseEntity =
new RestTemplate()
.exchange(
uri,
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<Resources<Resource<MyEntity>>>() {}
, port
)
当像上面那样用几乎任何类型的 Resources
、Resource
、List<MyEntity>
、MyEntity
等调用时,ResponseEntity
是空的.喜欢:
<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.19.0 更新到 spring-hateoas:0.20.0.RELEASE。 spring-hateoas:0.19.0 不支持指定的 jackson 2.7+ here.
我更新了我的客户端调用如下。
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 的实现,这最终导致了 'aha!' 时刻 blog。
相关位是默认 RestTemplate
没有将接受 header 设置为 application/hal+json
。相反,默认值为 application/x-spring-data-compact+json;charset=UTF-8
,它没有内容,只有链接。这就是为什么我的 Resources
类型的内容是空的。如上所述明确设置 MediaType 解决了这个问题。
这是我的解决方案:
ParameterizedTypeReference<PagedResources<EntityObject>> responseType;
responseType = new ParameterizedTypeReference<PagedResources<EntityObject>>() { };
ResponseEntity<PagedResources<EntityObject>> pageResources;
pageResources = restTemplate
.withBasicAuth(username, password)
.exchange(
UriComponentsBuilder.fromPath("/your/api/path").build().toString(),
GET,
null,
responseType
);
PagedResources<EntityObject> resource = pageResources.getBody();
assertTrue(resource.getContent().isEmpty());
我正在使用 Spring Data REST 2.5.1,Jackson 2.8.0,Spring Boot 1.3.6。
我正在尝试通过 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, port)
正如许多 SO 问题似乎表明的那样,找到检索列表的示例是一个问题。我试过 ParameterizedTypeReference
与 Resources
、Resource
、MyEntity
、数组、列表。都没有运气。
ResponseEntity<Resources<Resource<MyEntity>>> responseEntity =
new RestTemplate()
.exchange(
uri,
HttpMethod.GET,
HttpEntity.EMPTY,
new ParameterizedTypeReference<Resources<Resource<MyEntity>>>() {}
, port
)
当像上面那样用几乎任何类型的 Resources
、Resource
、List<MyEntity>
、MyEntity
等调用时,ResponseEntity
是空的.喜欢:
<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.19.0 更新到 spring-hateoas:0.20.0.RELEASE。 spring-hateoas:0.19.0 不支持指定的 jackson 2.7+ here.
我更新了我的客户端调用如下。
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 的实现,这最终导致了 'aha!' 时刻 blog。
相关位是默认 RestTemplate
没有将接受 header 设置为 application/hal+json
。相反,默认值为 application/x-spring-data-compact+json;charset=UTF-8
,它没有内容,只有链接。这就是为什么我的 Resources
类型的内容是空的。如上所述明确设置 MediaType 解决了这个问题。
这是我的解决方案:
ParameterizedTypeReference<PagedResources<EntityObject>> responseType;
responseType = new ParameterizedTypeReference<PagedResources<EntityObject>>() { };
ResponseEntity<PagedResources<EntityObject>> pageResources;
pageResources = restTemplate
.withBasicAuth(username, password)
.exchange(
UriComponentsBuilder.fromPath("/your/api/path").build().toString(),
GET,
null,
responseType
);
PagedResources<EntityObject> resource = pageResources.getBody();
assertTrue(resource.getContent().isEmpty());