'Kumuluzee microprofile rest client - cannot get response body in error responses
I am trying to get error response body in java application runnig on Kumuluzee 3.9.0. I dont know, why it is not possible to get response from response with HTTP status 4xx. I tried to get response body via casting entity to InputStream and read bytes in loop, but no bytes returned. IDE debugger shows entity with byteArrayInputStrem in.
Thanks for you help.
@Path("/rest")
public interface MyClient {
@GET
@Path("/{value}")
@Consumes(MediaType.APPLICATION_JSON)
MyResponse getValue(@PathParam("value") String value);
@ApplicationScoped
public class MyRestClient {
private MyClient client;
@PostConstruct
public void init() throws Exception{
try {
URI uri = new URI("http://localhost:8080/myservice/");
client = RestClientBuilder.newBuilder()
.baseUri(uri)
.build(MyClient.class);
}catch(Exception e){
log.error("", e);
throw e;
}
}
public String getValue(String data) {
try {
MyResponse myResponse = client.getMyResponse(String data);
if (myResponse != null) {
return myResponse.getValue(); //this works perfectly
}
} catch(WebApplicationException e){
Response response = e.getResponse(); //in case of 4xx responses I cannot get response body
if(response.hasEntity()){ //always return false, but response body is there
log.error("response body: " + response.getEntity());
}
Object entity = response.getEntity(); //IDE debug shows entity with bytearray in, but not able to read bytes programatically
String body = new BufferedReader(new InputStreamReader((FilterInputStream) e.getResponse().getEntity()))
.lines().collect(Collectors.joining("\n")); //does not work, returns empty string
String body2 = response.readEntity(String.class) //even this does not work
log.error("Unable to response..", e);
}catch (Exception e) {
log.error("Unable to get response.", e);
}
return null;
}
Solution 1:[1]
This work for me:
private void logWebApplicationException(WebApplicationException e) {
final Response response = e.getResponse();
final int status = response.getStatus();
if (response.hasEntity()) {
final Object entity = response.getEntity();
if (entity instanceof ByteArrayInputStream) {
ByteArrayInputStream erroIs = (ByteArrayInputStream) entity;
String error = new String(erroIs.readAllBytes(), StandardCharsets.UTF_8);
log.error("Erro ao tentar obter arquivos RCO do SIMPI. Status: {}. Descricao: {} ",
status, error);
}
} else {
log.error("Erro ao tentar obter arquivos RCO do SIMPI. Status: {}. Descricao: {}",
status, response.getStatusInfo().getReasonPhrase());
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Marcelo Martins |
