Javax.ws.rs.ProcessingException: ошибка чтения объекта из входного потока при чтении списка объектов в Java

Я использую Дропвизард. Я пытаюсь использовать 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;
}

Я убрал импорт.

Что такое ошибка чтения из входного потока? Информации почти наверняка больше. И является ли InactiveAgentsDtoсериализуемым?

stdunbar 11.10.2022 21:40

Объект сериализуем. Кроме этого сообщения об ошибке нет

CuriousCat 11.10.2022 21:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это исправление. Я создал новый класс, содержащий список неактивных агентов. Класс называется 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;
    }
}

Другие вопросы по теме