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.

JerseyTest con cliente ApacheCXF no devuelve un reasonPhrase.

Tengo un simple JerseyTest que se ve así:

final Response getResponse = this.target(endpoint).get();
assertStatusEquals(Status.NOT_FOUND, getResponse);
assertEquals(“No se puede encontrar algo”, getResponse.getStatusInfo().getReasonPhrase());

Esto funcionaba bien cuando utilizaba el cliente estándar JerseyClient. Sin embargo, cambié a ApacheCXF porque quiero usar el método PATCH.


// Queremos admitir PATCH, que no es bueno en HttpUrlConnection de Java.
// Es por eso que necesitamos una implementación de HttpClient diferente (Esto es ApaceCXF)
// Necesitamos registrar JacksonJaxbJsonProvider
private final Client cxfHttpClient = new ClientBuilderImpl().build()
.register(JacksonJaxbJsonProvider.class);

// Configurarlo antes de cada prueba

@Override
public void setUp() throws Exception {
super.setUp();
this.setClient(this.cxfHttpClient);
}

Ahora esta simple prueba falla porque .getReasonPhrase() devuelve null. No he cambiado el servidor, así que espero que el mensaje esté presente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con null getReasonPhrase() en ApacheCXF

    Como experto en TI especializado en REST, Jersey, Response y CXF, has notado un problema con una simple prueba de JerseyTest. La prueba funciona bien con el cliente JerseyClient estándar, pero después de cambiar a ApacheCXF para usar el método PATCH, la prueba falla. Al ejecutar la prueba, el método .getReasonPhrase() devuelve null. Sin embargo, el servidor no ha cambiado y esperas que el mensaje esté ahí.

    Para resolver este problema, necesitas configurar el cliente ApacheCXF con un proveedor adicional para manejar la respuesta. Puedes lograr esto registrando el proveedor ResponseExceptionMapper. Aquí te mostramos cómo puedes actualizar tu código para solucionar el problema:

    // Crea un cliente HTTP ApacheCXF y registra el proveedor requerido
    private final Client cxfHttpClient = ClientBuilder.newClient().register(ResponseExceptionMapper.class);
    
    // Configúralo antes de cada prueba
    @Override
    public void setUp() throws Exception {
        super.setUp();
        this.setClient(this.cxfHttpClient);
    }
    

    Al registrar el proveedor ResponseExceptionMapper, el método getReasonPhrase() ahora devolverá el mensaje esperado y tu JerseyTest debería funcionar correctamente con ApacheCXF.

Comments are closed.