2015-06-03 20 views
7

Client Mam prosty klient korzystając RESTEasy następująco:RESTEasy Exception Handling

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

} 

Serwer jest skonfigurowany tak, aby zwrócić na http://localhost/test400 - Bad Request wraz z pomocnym wiadomości. A BadRequestException jest wyrzucane przez ClientProxy. Oprócz pakowania w try/catch, jak mogę uczynić getTest() wychwycić wyjątek i zwrócić pomocny komunikat Response jako ciąg. Próbowałem różnych implementacji ClientExceptionMapper, ale wydaje mi się, że to dobrze. Powyższy kod nigdy nie wywołuje toException. Czego tu mi brakuje?

Moja obecna praca polega na użyciu ClientResponseFilter, a następnie zrobienia setStatus(200) i nadania oryginalnego statusu w jednostce odpowiedzi. W ten sposób unikam rzucania wyjątków.

+0

Czy możesz wyjaśnić, co masz na myśli przez "Serwer jest skonfigurowany do zwracania 400 - Bad Request"? Moim zdaniem jest to, że implementacja 'MyProxy.getTest()' powinna w rzeczywistości rzucić wyjątek, który zawiera pomocną wiadomość. Następnie należy użyć ExceptionMapper, aby odwzorować ten wyjątek na odpowiedź 400 - Bad Request (można dołączyć wiadomość jako treść odpowiedzi). – FGreg

+1

Przeczytaj pierwsze zdanie mojego pytania. Piszę klienta, a nie serwer. – gogators

Odpowiedz

-1

Radzę przejrzeć interfejs API klienta Jax-RS, chyba że jest potrzebna funkcjonalność przy użyciu klientów RestEasy. (RestEasy statki z JAX-RS, więc nie ma żadnych różnic Library)

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(); 

Powodem dlaczego odwzorowujący nie działa dlatego, że klient nie jest faktycznie rzucanie wyjątku. Klient zwraca poprawny wynik do proxy, a proxy to czyta i rzuca wyjątek, co dzieje się po tym, jak program odwzorowujący może go przechwycić.

+0

Czy to nie wyjawia wszystkich zalet korzystania z serwera proxy (na przykład/test jest zakodowany w powyższym przykładzie)? Przeczytałem pytanie, w jaki sposób uzyskać proxy, aby wyrzucić bardziej przydatny wyjątek. Dziwne jest dla mnie, że proxy zwraca wyjątek z zakodowanym na sztywno komunikatem "złego żądania", gdy aktualna wiadomość znajduje się w odpowiedzi. Czy istnieje przechwytywacz przechwytywania wyjątków serwera proxy? –