Spring WebClient PageImpl 内容缺少字段

Spring WebClient PageImpl Content is missing field

我尝试通过 WebClient 从另一个 microservice.If 检索一个页面我直接用 Postman 请求这个 MS,我在页面内得到 content 的“类型”等信息.但是,如果我通过 webClient 请求 MS,“类型”将从 content(以及其他一些字段)中消失。内容是一个抽象列表 class account with 'type' as JsonSubTypes
有人能找到错误吗,为什么是“类型”-attrib。消失了?

回复

来自http://localhost:8080/api/v1/accounts

的回应
{
    "content": [
        {
            "type": "savingsBook",
            "id": 108,
            "accountNumber": 99781944,
            ...
        }
    ], "pageable": {
        ...
    }, "totalPages": ...
    ...
}
    

来自http://localhost:8081/accounts

的回应
{
    "content": [
        {
            "id": 108,
            "accountNumber": 99781944,
            ...
        }
    ], "pageable": {
        ...
    }, "totalPages": ...
    ...
}

代码片段:

8080 的账户管理员

@RequestMapping(method = RequestMethod.GET, produces = "application/json")
public <T extends Account> Page<T> getAccounts(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "pageSize", required = false) Integer pageSize, @RequestParam(value = "sortBy", required = false) String sortBy) {
    if (page == null) {
        page = 0;
    }
    if (pageSize == null) {
        pageSize = 10;
    }
    if (sortBy == null) {
        Page<T> p = accountService.getAccounts(page, pageSize);
        return new PageImpl<T>(p.getContent(), p.getPageable(), p.getTotalElements()) {};

    } else {
        Sort sort = Sort.by(sortBy);
        Page<T> p = accountService.getAccounts(page, pageSize, sort);
        return new PageImpl<T>(p.getContent(), p.getPageable(), p.getTotalElements()) {};
    }
}

8081 账户管理员

@GetMapping
public  <T extends Account> Page<T> getAllAccounts(@RequestParam(value = "page", required = false) Integer page, 
                                                   @RequestParam(value = "pageSize", required = false) Integer pageSize,
                                                   @RequestParam(value = "sortBy", required = false) String sortBy) {   
     if (page == null) {
         page = 0;
     }
     if (pageSize == null) {
         pageSize = 10;
     }
     if (sortBy == null) {
         return accountService.getAllAccounts(page, pageSize);
     } else {
         return accountService.getAllAccounts(page, pageSize, sortBy);
     }
}

8081 账户服务

public <T extends Account> Page<T> getAllAccounts(Integer pageNumber, Integer pageSize) {
    ParameterizedTypeReference<CustomPageImpl<T>> typeReference = new ParameterizedTypeReference<CustomPageImpl<T>>(){};
    System.out.println("Anfrage an: " + addr + "/accounts/");
    System.out.println(client.get().uri("/accounts/").retrieve().bodyToMono(typeReference).block().getContent());
    Page<T> prodData = (CustomPageImpl<T>)(client.get().uri("/accounts/").retrieve().bodyToMono(typeReference).block());
    return prodData;
}

CustomPageImpl(从另一个 Whosebug 得到的-Post)

public class CustomPageImpl<T> extends PageImpl<T> {
    private static final long serialVersionUID = 1L;

    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public CustomPageImpl(@JsonProperty("content") List<T> content,
            @JsonProperty("number") int number,
            @JsonProperty("size") int size,
            @JsonProperty("totalElements") Long totalElements,
            @JsonProperty("pageable") JsonNode pageable,
            @JsonProperty("last") boolean last,
            @JsonProperty("totalPages") int totalPages,
            @JsonProperty("sort") JsonNode sort,
            @JsonProperty("first") boolean first,
            @JsonProperty("numberOfElements") int numberOfElements){
        super(content, PageRequest.of(number, size) , totalElements);
    }
    public CustomPageImpl(List<T> content, Pageable pageable, long total) {
        super(content, pageable, total);
    }

    public CustomPageImpl(List<T> content) {
        super(content);
    }

    public CustomPageImpl() {
        super(new ArrayList<>());
    }
}
    

我自己找到了这个问题的答案。

问题在于,Account 是抽象的并且具有 json 子类型。通过用 public class CustomPageImpl<T extends Account> extends PageImpl<T> 替换 public class CustomPageImpl<T> extends PageImpl<T> 我能够解决这个问题。现在我按计划收到了类型。