gpt4 book ai didi

rest - Spring Data REST - 使用实体列表,Java HATEOAS 客户端

转载 作者:行者123 更新时间:2023-12-04 22:57:41 24 4
gpt4 key购买 nike

我使用的是 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
)

或者
new RestTemplate().getForEntity(uri + "/1", MyEntity.class, port)

正如许多 SO 问题似乎表明的那样,查找检索列表的示例是一个问题。我试过 ParameterizedTypeReferenceResources , 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 实现,这最终导致了“啊哈!”与此有关的时刻 blog .

    相关位是默认 RestTemplate不将接受 header 设置为 application/hal+json .相反,默认值为 application/x-spring-data-compact+json;charset=UTF-8它没有内容,只有链接。这就是为什么我的 Resources 得到空内容的原因类型。如上所述显式设置 MediaType 解决了该问题。

    关于rest - Spring Data REST - 使用实体列表,Java HATEOAS 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38468839/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com