Jud*_*ing 4 rest spring-mvc spring-data-rest spring-hateoas
我正在使用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
)
Run Code Online (Sandbox Code Playgroud)
或者新的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
)
Run Code Online (Sandbox Code Playgroud)
当所谓的像上面几乎任何种类的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=[...]}>
Run Code Online (Sandbox Code Playgroud)
字符串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
}
}
Run Code Online (Sandbox Code Playgroud)
存储库定义:
@RepositoryRestResource(collectionResourceRel = "myEntities", path = "myEntity")
public interface MyEntityRepository extends PagingAndSortingRepository<MyEntity, Long>
, QueryDslPredicateExecutor<MyEntity>
, QuerydslBinderCustomizer<QMyEntity> { }
Run Code Online (Sandbox Code Playgroud)
对我失踪的任何想法?
我通过做一些事情来解决这个问题.
我不得不更新到spring-hateoas:0.20.0.RELEASE从0.19.0.spring-hateoas:0.19.0不支持这里指定的jackson 2.7+ .
我更新了我的客户,如下所示.
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
)
Run Code Online (Sandbox Code Playgroud)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]}>
Run Code Online (Sandbox Code Playgroud)
@ zeroflagL的评论让我更仔细地研究了PagedResources的实现,最终导致了'啊哈!' 这个博客的时刻.
相关位是默认情况下RestTemplate不将accept标头设置为application/hal+json.相反,默认值application/x-spring-data-compact+json;charset=UTF-8不包含内容且仅包含链接.这就是我为我的Resources类型获取空内容的原因.如上所述明确设置MediaType可以解决问题.
| 归档时间: |
|
| 查看次数: |
6053 次 |
| 最近记录: |