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>
我能够解决这个问题。现在我按计划收到了类型。
我尝试通过 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>
我能够解决这个问题。现在我按计划收到了类型。