Spring 5 Reactive WebClient 似乎没有反序列化参数化类型
Spring 5 Reactive WebClient does not seem to deserialize parameterized types
这个问题以前的标题是"Spring 5 Reactive WebClient consuming HAL+JSON HATEOAS PagedResources",但新标题更合适。
以下代码与 RestTemplate 完美配合(参数化类型是从 HATEOAS/HAL PagedResource 返回的,由 Spring DataREST 提供):
// use exchange with ParameterizedTypeReference
ResponseEntity<PagedResources<Foo>> responseEntity =
restTemplate.exchange("/foos", HttpMethod.GET, null,
new ParameterizedTypeReference<PagedResources<Foo>>() {},
randomServerPort, 0, 100);
// then the actual list of foos can be obtained like so
PagedResources<Foo> resources = responseEntity.getBody();
List<foo> foos = new ArrayList(resources.getContent());
这不适用于 Spring 5 Reactive WebClient:
public Mono<PagedResources<Foo>> getFoos() {
return client.get()
.uri("/foos").accept(MediaTypes.HAL_JSON)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<PagedResources<Foo>>(){});
}
上面调用service方法的controller代码是:
@GetMapping("/foos")
public Mono<PagedResources<Foo>> getFoos() {
return dataService.getFoos();
}
curl 的结果是:
{"links":[],"content":[],"page":null}
经过大量研究,上面的代码应该可以工作,因为参数化类型应该像上面显示的 RestTemplate 的情况一样传递给 Jackson。
这现在看起来更像是一个错误。但在提交之前,我想看看是否有人拥有使用参数化类型(即 ParameterizedTypeReference、Super Type Tokens 等)的 WebClient bodyToXXX
请注意,WebClient 代码中对此进行了测试,但目前可能不支持嵌入式类型 ref (PagedResources) 或存在错误:
目前 Spring Data REST 和 Spring HATEOAS 目前都不支持 Reactor 类型。
这个问题以前的标题是"Spring 5 Reactive WebClient consuming HAL+JSON HATEOAS PagedResources",但新标题更合适。
以下代码与 RestTemplate 完美配合(参数化类型是从 HATEOAS/HAL PagedResource 返回的,由 Spring DataREST 提供):
// use exchange with ParameterizedTypeReference
ResponseEntity<PagedResources<Foo>> responseEntity =
restTemplate.exchange("/foos", HttpMethod.GET, null,
new ParameterizedTypeReference<PagedResources<Foo>>() {},
randomServerPort, 0, 100);
// then the actual list of foos can be obtained like so
PagedResources<Foo> resources = responseEntity.getBody();
List<foo> foos = new ArrayList(resources.getContent());
这不适用于 Spring 5 Reactive WebClient:
public Mono<PagedResources<Foo>> getFoos() {
return client.get()
.uri("/foos").accept(MediaTypes.HAL_JSON)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<PagedResources<Foo>>(){});
}
上面调用service方法的controller代码是:
@GetMapping("/foos")
public Mono<PagedResources<Foo>> getFoos() {
return dataService.getFoos();
}
curl 的结果是:
{"links":[],"content":[],"page":null}
经过大量研究,上面的代码应该可以工作,因为参数化类型应该像上面显示的 RestTemplate 的情况一样传递给 Jackson。
这现在看起来更像是一个错误。但在提交之前,我想看看是否有人拥有使用参数化类型(即 ParameterizedTypeReference、Super Type Tokens 等)的 WebClient bodyToXXX
请注意,WebClient 代码中对此进行了测试,但目前可能不支持嵌入式类型 ref (PagedResources) 或存在错误:
目前 Spring Data REST 和 Spring HATEOAS 目前都不支持 Reactor 类型。