Spring WebClient Response for Microservice Communication中缺少属性“type”

mspsb9vt  于 2023-05-16  发布在  Spring
关注(0)|答案(2)|浏览(126)

我想使用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<>());
    }
}
suzh9iv8

suzh9iv81#

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

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

smdnsysy

smdnsysy2#

如果你不想实现你的CustomPageImpl,你可以在JacksonObjectMapper中注册一个模块。

@Configuration
public class JacksonConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper()
            .registerModule(new PageJacksonModule())
            .registerModule(new SortJacksonModule());
    }

}

SortJacksonModulePageJacksonModule来自org.springframework.cloud.openfeign.support

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

相关问题