Я начал разрабатывать приложение на основе API publi c, которое возвращает не дружественный тип данных в формате text/HTML
. Несколько конечных точек возвращают нормальные данные, не размывая их, но есть такая, которая добавляет дополнительные \
к каждому элементу в ответ.
пример ответа ниже:
"{\"country\":\"Poland\",\"stat_by_country\":[{\"id\":\"365\",\"country_name\":\"Poland\",\"total_cases\":\"238\",\"new_cases\":\"61\",\"active_cases\":\"232\",\"total_deaths\":\"5\",\"new_deaths\":\"1\",\"total_recovered\":\"1\",\"serious_critical\":\"3\",\"region\":null,\"total_cases_per1m\":\"6.3\",\"record_date\":\"2020-03-17 21:00:05.485\"}]
Мои классы-оболочки выглядят следующим образом:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public class CountryCasesHistory {
private String id;
private String country_name;
private String total_cases;
private String new_cases;
private String active_cases;
private String total_deaths;
private String new_deaths;
private String total_recovered;
private String serious_critical;
private String region;
private String total_cases_per1m;
private String record_date;
}
и
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public class CountryCasesHistoryWrapper {
@JsonProperty("country")
private String country;
@JsonProperty("stat_by_country")
private Set<CountryCasesHistory> statsByCountry;
}
Сервис и обработчик выглядят следующим образом :
@Service
public class Covid19APIService {
@Value("${rapid-API-URL}")
private String covidAPIURL;
@Value("${x-rapidapi-host}")
private String covidAPI;
@Value("${x-rapidapi-key}")
private String covidAPIKey;
public Mono<CountryCasesHistoryWrapper> findCasesHistoryForCountry(String country) {
return buildWebClient()
.get()
.uri("/cases_by_particular_country.php")
.retrieve()
.onStatus(
HttpStatus::is4xxClientError,
response -> error(new InfrastructureException("Covid19 public API not found")))
.onStatus(
HttpStatus::is4xxClientError,
response -> error(new InfrastructureException("Covid19 public API server exception")))
.bodyToMono(CountryCasesHistoryWrapper.class);
}
private void acceptedCodecs(ClientCodecConfigurer clientCodecConfigurer) {
clientCodecConfigurer
.customCodecs()
.register(new Jackson2JsonEncoder(new ObjectMapper(), TEXT_HTML));
clientCodecConfigurer
.customCodecs()
.register(new Jackson2JsonDecoder(new ObjectMapper(), TEXT_HTML));
}
}
Обработчик. java
@Component
@RequiredArgsConstructor
public class Covid19APIHandler {
private final Covid19APIService apiService;
public Mono<ServerResponse> getCasesHistoryForCountry(ServerRequest serverRequest) {
String country =
serverRequest
.queryParam("country")
.orElseThrow(
() -> new InfrastructureException("Country parameter is required for this action"));
final Mono<CountryCasesHistoryWrapper> casesHistoryForCountry =
apiService.findCasesHistoryForCountry(country);
return casesHistoryForCountry
.flatMap(
gc ->
ok().contentType(APPLICATION_JSON)
.body(fromPublisher(casesHistoryForCountry, CountryCasesHistoryWrapper.class)))
.switchIfEmpty(noContent().build());
}
}
Текущие решения приводят к ошибке бэкэнда:
"message": "Invalid JSON input: Unrecognized field \"error\" (class com.covid.domain.model.CountryCasesHistoryWrapper), not marked as ignorable; nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field \"error\" (class com.covid.domain.model.CountryCasesHistoryWrapper), not marked as ignorable (2 known properties: \"stat_by_country\", \"country\"])\n at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 11] (through reference chain: com.covid.domain.model.CountryCasesHistoryWrapper[\"error\"])"
Мой вопрос, возможно ли избавиться от отключите каждый \
из ответа и получите в результате нормальный, не размытый объект и, следовательно, ошибку обхода. Буду благодарен за предложение о том, как достичь цели.
РЕДАКТИРОВАТЬ: я могу использовать блок на Mono и переназначить значения в другой объект с помощью метода .replaceAll
, но это не желательное решение. У кого-нибудь есть другое предложение?