I am using Dropwizard. I am trying to use Response to read a class that returns a list of an Object. I have tried using Generic Type and read comments of people who have similar issues but I still have the same error message on hitting the endpoint.
This is the method that calls the 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());
}
This is the error that I have.
javax.ws.rs.ProcessingException: Error reading entity from input stream
I have also tried this
return response.readEntity(new ArrayList<InactiveAgentsDto>().getClass());
I get the same error message as above.
on logging String.class, I get the desired data that I need.
log.info("This is the error message {}", response.readEntity(String.class));
This prints the list of data to the console. Still wondering what I am doing wrong.
This is the content of 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;
}
I have taken out the imports.
This is the fix. I created a new class that contains a List of inactive agents. The class is called AllAgentsInfo.
public class AllAgentsInfo {
private List<InactiveAgentsDto> data;
}
Then I had to rewrite the method to this
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);
}
This fixed my problem. In case you are wondering what the 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;
}
}