简体   繁体   English

Kumuluzee 微配置文件 rest 客户端 - 无法在错误响应中获取响应正文

[英]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.我正在尝试在 Kumuluzee 3.9.0 上运行的 java 应用程序中获取错误响应正文。 I dont know, why it is not possible to get response from response with HTTP status 4xx.我不知道,为什么无法从 HTTP 状态 4xx 的响应中获得响应。 I tried to get response body via casting entity to InputStream and read bytes in loop, but no bytes returned.我试图通过将实体转换为 InputStream 来获取响应主体并在循环中读取字节,但没有返回字节。 IDE debugger shows entity with byteArrayInputStrem in. IDE 调试器显示带有 byteArrayInputStrem 的实体。

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;
    }

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());
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM