2016-05-07 5 views
0

Ich habe eine benutzerdefinierte ErrorDecoder implementiert:Netflix Feign: Antwort Körper leer in ErrorDecoder auf 404

public class WebShopErrorDecoder implements ErrorDecoder { 

    @Override 
    public Exception decode(String methodKey, Response response) { 

    JacksonDecoder jacksonDecoder = new JacksonDecoder(); 
    try { 
     ErrorResource error = (ErrorResource) jacksonDecoder.decode(response, ErrorResource.class); 

     return new EShopRequestException(error, HttpStatus.valueOf(response.status())); 
    } catch (IOException e) { 

     return new EShopRequestException(new ErrorResource("error.internal", "Internal server error"), 
       HttpStatus.INTERNAL_SERVER_ERROR); 
    } 
    } 
} 

Was ich mit diesem WebShopErrorDecoder ist erreichen wollen die Fehlerreaktion zu übermitteln. Mein Problem ist, dass, wenn der Antwortstatus 404 ist, die ErrorResource error null ist.

Wenn ich den zurückgegebenen Antwortstatus zum Beispiel auf 400 ändern, enthält die Fehlerressource die Antwort.

Bei der Anforderung des verbrauchten Dienstes direkt über den Browser ich die Antwort Körper mit einer Antwortstatus von 404.

Warum ist die Antwort Körper einer feign Anforderung leer sehen kann, wenn der Dienst 404 zurückkehrt? Gibt es eine Möglichkeit, den Antworttext zu erhalten?

Ich fing gerade an, mit Schein zu arbeiten, also, wenn meine Frage unklar ist, lassen Sie mich bitte wissen, und ich versuche zu klären, was fehlt.

Vielen Dank im Voraus!

Antwort

0

Okay, ich habe gerade herausgefunden, warum die Antwort leer ist. Es ist nicht falsch, es ist meins.

Da ich JacksonDecoder benutze, bekomme ich immer eine leere Antwort, wenn der Antwortstatus 404 wegen des folgenden Codes in JacksonDecoder ist.

.. 
public Object decode(Response response, Type type) throws IOException { 
    if(response.status() == 404) { 
     return Util.emptyValueOf(type); 
    } 
.. 

Was ich stattdessen mit ResponseEntityDecoder tun.

public class WebShopErrorDecoder implements ErrorDecoder { 

    private final ResponseEntityDecoder decoder; 

    public WebShopErrorDecoder(ResponseEntityDecoder decoder) { 
    this.decoder = decoder; 
    } 

    @Override 
    public Exception decode(String methodKey, Response response) { 
    try { 
     ErrorResource error = (ErrorResource) decoder.decode(response, ErrorResource.class); 

     return new EShopRequestException(error, HttpStatus.valueOf(response.status())); 
    } catch (IOException e) { 

     return new EShopRequestException(new ErrorResource("error.internal", "Internal server error"), 
       HttpStatus.INTERNAL_SERVER_ERROR); 
    } 
    } 
} 

Jetzt funktioniert alles einwandfrei :)