0

我正在尝试在 Kumuluzee 3.9.0 上运行的 java 应用程序中获取错误响应正文。我不知道,为什么无法从 HTTP 状态 4xx 的响应中获得响应。我试图通过将实体转换为 InputStream 来获取响应主体并在循环中读取字节,但没有返回字节。IDE 调试器显示带有 byteArrayInputStrem 的实体。

谢谢你的帮助。

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

1 回答 1

0

这对我有用:

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());
    }
}
于 2022-02-02T14:05:42.457 回答