Обработка исключений клиента 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();
Причина, по которой ваш картограф не работает, заключается в том, что клиент фактически не выбрасывает исключение. Клиент возвращает действительный результат в прокси-сервер, а прокси-сервер читает это и бросает исключение, которое происходит после того, как он может перехватить его.