Я использую Дропвизард. Я пытаюсь использовать Response для чтения класса, который возвращает список объектов. Я пытался использовать Generic Type и читал комментарии людей, у которых были похожие проблемы, но у меня все равно появляется то же сообщение об ошибке при попадании в конечную точку.
Это метод, который вызывает API.
public List<InactiveAgentsDto> fetchAgentsUnderAggregator(String aggregatorId, String token) throws RecordNotFoundException, IOException {
String url = this.baseUrl+"/api/v1/users/aggregator/agent/" + aggregatorId;
Response response = client.target(url).request().header(HttpHeaders.AUTHORIZATION, token).get();
if (response.getStatus() == 200){
List<InactiveAgentsDto> allAgents = response.readEntity(new GenericType<List<InactiveAgentsDto>>(){});
return allAgents;
}
throw new RecordNotFoundException(response.getStatusInfo().getReasonPhrase());
}
Это ошибка, которая у меня есть.
javax.ws.rs.ProcessingException: Error reading entity from input stream
Я также пробовал это
return response.readEntity(new ArrayList<InactiveAgentsDto>().getClass());
Я получаю то же сообщение об ошибке, что и выше.
при регистрации String.class я получаю нужные мне данные.
log.info("This is the error message {}", response.readEntity(String.class));
Это выводит список данных на консоль. Все еще интересно, что я делаю неправильно.
Это содержимое inactiveAgentsDTO
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public classInactiveAgentsDto {
private String agentId;
private String firstName;
private String lastName;
private String state;
private String aggregatorId;
private String phoneNumber;
private BigDecimal cashOutAmount;
private long cashOutCount;
private Types.AgentTransactionStatus status;
}
Я убрал импорт.
Объект сериализуем. Кроме этого сообщения об ошибке нет
Это исправление. Я создал новый класс, содержащий список неактивных агентов. Класс называется AllAgentsInfo.
public class AllAgentsInfo {
private List<InactiveAgentsDto> data;
}
Затем мне пришлось переписать метод на этот
public AllAgentsInfo fetchAgentsUnderAggregator(String aggregatorId, String token) throws RecordNotFoundException,
IOException {
String url = this.baseUrl+"/api/v1/users/aggregator/agent/" + aggregatorId;
Response response = client.target(url).request().header(HttpHeaders.AUTHORIZATION, token).get();
String stringEntity = response.readEntity(String.class);
ResponseDto responseDto = new ObjectMapper().readValue(stringEntity, ResponseDto.class);
if (Objects.isNull(responseDto) || !responseDto.isStatus()){
String message = Objects.isNull(responseDto) || Objects.isNull(responseDto.getMessage()) ? "Unable to get agent information" : responseDto.getMessage();
throw new InternalServerErrorException(message);
}
return new ObjectMapper().convertValue(responseDto, AllAgentsInfo.class);
}
Это решило мою проблему. Если вам интересно, что такое ResponseDTO.
public class ResponseDto<T> {
private String message;
private String responseCode;
private boolean status;
private T data;
public ResponseDto(String message, String responseCode, boolean status, T data) {
this.message = message;
this.responseCode = responseCode;
this.status = status;
this.data = data;
}
}
Что такое ошибка чтения из входного потока? Информации почти наверняка больше. И является ли
InactiveAgentsDto
сериализуемым?