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) 或存在错误:

https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java#L149

错误提交:https://jira.spring.io/browse/SPR-16715

目前 Spring Data REST 和 Spring HATEOAS 目前都不支持 Reactor 类型。