在get请求中传递Spring Page

问题描述 投票:0回答:1

我需要使用 restamplate.exchange 从 spring 应用程序发送 get 请求到另一个 spring 应用程序,如果我发送这样的请求:

public Page<DenominationLogActivityResponseDto> getLogActivities(String token, Integer page,
      Integer limit, String sortBy, String order) {

    HttpHeaders headers = addTokenHeader(token);
    HttpEntity<String> httpEntity = new HttpEntity<>(null, headers);

    UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(
            masterUrl + "/denomination/log?page={page}&limit={limit}&order={order}&sortBy{sortBy}")
        .queryParam("page", page)
        .queryParam("limit", limit)
        .queryParam("order", order)
        .queryParam("sortBy", sortBy)
        .build();
    ResponseEntity<BaseResponse<Page<DenominationLogActivityResponseDto>>> logActivityResponse =
        restTemplate.exchange(
            uriComponents.toUriString(),
            HttpMethod.GET,
            httpEntity,
            new ParameterizedTypeReference<>() {
            }, page, limit, order, sortBy);
    if (!logActivityResponse.getStatusCode().is2xxSuccessful()) {
      throw new TransactionException(
          logActivityResponse.getBody().getStatus(),
          logActivityResponse.getBody().getMessage(),
          logActivityResponse.getBody().getErrorMessage());
    }
    return logActivityResponse.getBody().getData();
  }

另一个春季应用程序:

    @GetMapping("/log")
    public ResponseEntity<?> getViewTableDenomination(@RequestParam(required = false) Integer page,
                                                        @RequestParam(required = false) Integer limit,
                                                        @RequestParam(required = false) String sortBy,
                                                        @RequestParam(required = false) String order) {
        
        Page<ViewTableResponseDto> data = service.getDenominationViewTable(page, limit, sortBy, order);
        
        BaseResponse<Page<ViewTableResponseDto>> response = new BaseResponse<>(
                String.valueOf(HttpStatus.OK.value()),
                "Success",
                null,
                data
        );
        
        return ResponseEntity.ok(response);
    }

我收到一条错误消息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.data.domain.Page` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
java json spring spring-boot
1个回答
0
投票

Jackson 库在尝试序列化抽象类或接口时会出现此错误,例如 Page。为了解决这个问题,Jackson 库需要提供一种方法来序列化抽象类或接口,例如 Page。有几种选择:

创建一个实现 Page 的具体类 序列化Page等抽象类或接口时,需要创建一个实现该接口的具体类并注解,由Jackson库进行序列化

实现自定义序列化器 Jackson 库提供了一种实现自定义序列化程序的方法。这允许抽象类或接口如 Page 的序列化。此方法实现起来可能很复杂,但它是序列化抽象类或接口的常用方法。

使用混合 Jackson 库提供了一个叫做 Mixin 的特性,它允许在序列化抽象类或接口(例如 Page)时提供额外的信息。这种方法最容易实现,但可能会导致维护问题,因为它没有使用 Jackson 库提供的功能。

通过选择上述方法之一,可以解决此错误。

© www.soinside.com 2019 - 2024. All rights reserved.