es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

RegisterRestClient WebApplicationException entidad de respuesta vacía

El problema es:

  • Tengo mi cliente jaxrs @RegisterRestClient en quarkus.
  • El servidor responde 500 (Lo esperado).
  • Luego capturo la excepción WebApplicationException lanzada al llamar al cliente jaxrs.
  • WebApplicationException tiene un método getResponse().
  • El problema es que WAE.getResponse().readEntity() está vacío.

La solución a este problema es conocida y se describe aquí:
https://github.com/quarkusio/quarkus/issues/17153#issuecomment-841573713
También aquí: https://stackoverflow.com/questions/68828392/resteasy-error-response-body-is-unreachable/68828710#68828710

La pregunta es: ¿por qué esa llamada a WAE.getResponse().readEntity() lanza una excepción sin entidad?
Simplemente parece contraintuitivo.

Intenté habilitar el registro de http.wire y parece que httpclient lee el cuerpo completo de la respuesta de error de todos modos. Por lo tanto, probablemente no era un problema de rendimiento.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que la llamada a WAE.getResponse().readEntity() arroja una excepción de entidad inexistente es porque la entidad de respuesta ya ha sido consumida por el servidor cuando devolvió el error 500. Este comportamiento no es específico de jaxrs o quarkus, sino más bien una característica general de HTTP en la cual una entidad solo puede ser consumida una vez.

    La solución a este problema es leer la entidad de respuesta tan pronto como sea posible después de hacer la solicitud, antes de cualquier manipulación de excepciones u otro procesamiento que pueda consumir la entidad. En el caso de jaxrs y quarkus, esto se puede hacer anotando el método cliente jaxrs con la anotación @Consumes(MediaType.WILDCARD) o utilizando el objeto Response devuelto por el método cliente, que permite acceder a la entidad de respuesta antes de que sea consumida por cualquier manipulación de excepciones u otro procesamiento.

    Es contra intuitivo que no se pueda acceder a la entidad de respuesta después de que se lance una excepción, pero es un aspecto fundamental del protocolo HTTP que se debe tener en cuenta al diseñar e implementar servicios web RESTful.

Comments are closed.