我想使用WebClient从另一个微服务中检索页面。当我使用Postman直接请求微服务时,响应包括type
属性以及content
部分中的其他字段。但是,当我通过WebClient发出请求时,type
属性(和其他一些字段)从content
部分消失。content
是抽象类Account
的对象列表。它使用JsonSubTypes
进行多态反序列化。
有人能帮我找出错误并理解为什么在使用WebClient调用微服务时“type”属性会消失吗?
以下是用于比较的样本响应:
回复
- 来自
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(从另一个StackOverflow-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<>());
}
}
2条答案
按热度按时间suzh9iv81#
我自己找到了这个问题的答案
问题是,Account是抽象的,并且有json子类型。通过将
public class CustomPageImpl<T> extends PageImpl<T>
替换为public class CustomPageImpl<T extends Account> extends PageImpl<T>
,我能够解决这个问题。现在我按计划收到了类型。smdnsysy2#
如果你不想实现你的CustomPageImpl,你可以在JacksonObjectMapper中注册一个模块。
SortJacksonModule
和PageJacksonModule
来自org.springframework.cloud.openfeign.support