Обработка исключений клиента RESTEasy

У меня есть простой клиент, использующий RESTEasy следующим образом:

public class Test {
    public static void main(String[] args) {
        ResteasyClient client = new ResteasyClientBuilder().build();
        ResteasyWebTarget target = client.target("http://localhost");
        client.register(new MyMapper());
        MyProxy proxy = target.proxy(MyProxy.class);
        String r = proxy.getTest();
    }
}

public interface MyProxy {
   @GET
   @Path("test")
   String getTest();
}

@Provider
public class MyMapper implements ClientExceptionMapper<BadRequestException>{

    @Override
    public RuntimeException toException(BadRequestException arg0) {
        // TODO Auto-generated method stub
        System.out.println("mapped a bad request exception");
        return null;
    }

}

Сервер настроен на возврат 400 - Bad Request на http://localhost/test вместе с полезным сообщением. A BadRequestException выбрасывается ClientProxy. Помимо обертывания в try/catch, как я могу сделать getTest() улавливать исключение и возвращать полезное сообщение Response в виде строки. Я пробовал различные реализации ClientExceptionMapper, но просто может показаться, что все правильно. Вышеприведенный код никогда не вызывает toException. Что мне здесь не хватает?

В моей текущей работе используется ClientResponseFilter, а затем выполните setStatus(200) и введите исходный статус в объекте ответа. Таким образом я избегаю исключения.

Ответ 1

ClientExceptionMapper в Resteasy устарел (см. документы по Java)

Платформа JAX-RS 2.0 client proxy в модуле resteasy-client делает не использовать org.jboss.resteasy.client.exception.mapper.ClientExceptionMapper.

Попробуйте использовать ExceptionMapper следующим образом:

import javax.ws.rs.ClientErrorException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class MyMapper implements ExceptionMapper<ClientErrorException> {

    @Override
    public Response toResponse(ClientErrorException e) {
        return Response.fromResponse(e.getResponse()).entity(e.getMessage()).build();
    }
}

С уважением,

Ответ 2

Я бы посоветовал использовать API-интерфейс Jax-RS, если вам не нужна функциональность с помощью клиентов RestEasy. (RestEasy поставляется с Jax-RS, поэтому нет различий в библиотеке)

Client client = ClientFactory.newClient();
WebTarget target = client.target("http://localhost/test");
Response response = target.request().get();
if ( response.getStatusCode() != Response.Status.OK.getStatusCode() ) {
    System.out.println( response.readEntity(String.class) );
    return null;
}
String value = response.readEntity(String.class);
response.close();

Причина, по которой ваш картограф не работает, заключается в том, что клиент фактически не выбрасывает исключение. Клиент возвращает действительный результат в прокси-сервер, а прокси-сервер читает это и бросает исключение, которое происходит после того, как он может перехватить его.