我需要使用 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
Jackson 库在尝试序列化抽象类或接口时会出现此错误,例如 Page。为了解决这个问题,Jackson 库需要提供一种方法来序列化抽象类或接口,例如 Page。有几种选择:
创建一个实现 Page 的具体类 序列化Page等抽象类或接口时,需要创建一个实现该接口的具体类并注解,由Jackson库进行序列化
实现自定义序列化器 Jackson 库提供了一种实现自定义序列化程序的方法。这允许抽象类或接口如 Page 的序列化。此方法实现起来可能很复杂,但它是序列化抽象类或接口的常用方法。
使用混合 Jackson 库提供了一个叫做 Mixin 的特性,它允许在序列化抽象类或接口(例如 Page)时提供额外的信息。这种方法最容易实现,但可能会导致维护问题,因为它没有使用 Jackson 库提供的功能。
通过选择上述方法之一,可以解决此错误。