web-dev-qa-db-ja.com

春のクライアントの例外処理

他のマイクロサービスにリクエストを送信するためにいくつかのfiegnクライアントがあります。

@FeignClient(name="userservice")
public interface UserClient {

    @RequestMapping(
            method= RequestMethod.GET,
                      path = "/userlist")
    String getUserByid(@RequestParam(value ="id") String id);

}

今、私はこのようなリクエストを送信しています

try {
    String responseData = userClient.getUserByid(id);
    return responseData;
    }

catch(FeignException e)
 {
 logger.error("Failed to get user", id);
}

catch (Exception e) 
{
 logger.error("Failed to get user", id);
}

ここで問題は、FeignExceptionが発生した場合にエラーコードが表示されないことです。

呼び出し元に送信するには、対応するエラーコードを他のAPIで送信する必要があります

では、エラーコードを抽出するにはどうすればよいですか?エラーコードを抽出してresponseEntityを作成したい

私は this コードを取得しましたが、関数でどのように使用できるか正確にわかりません。

3
kcoder

あなたはあなたの偽のクライアントにFallbackFactoryを実装しようとしましたか?

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#spring-cloud-feign-hystrix-fallback

Createメソッドでは、戻る前に、次のスニペットでhttpステータスコードを取得できます。

String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";

例:

@FeignClient(name="userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @RequestMapping(
            method= RequestMethod.GET,
                      path = "/userlist")
    String getUserByid(@RequestParam(value ="id") String id);

}


@Component
static class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {

     String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";

     return new UserClient() {
        @Override
        public String getUserByid() {
            logger.error(httpStatus);
            // what you want to answer back (logger, exception catch by a ControllerAdvice, etc)
        }
    };
}

}

1
rphlmr

同じ問題ではありませんが、これは私の状況で役立ちました。 OpenFeignのFeignExceptionは特定のHTTPステータスにバインドしません(つまり、Springの@ResponseStatusアノテーションを使用しません)。これにより、FeignExceptionが発生した場合、Springはデフォルトで500になります。 FeignExceptionには、特定のHTTPステータスに関連できないさまざまな原因が考えられるため、これで問題ありません。

ただし、SpringがFeignExceptionsを処理する方法を変更できます。 FeignExceptionを処理するExceptionHandlerを定義するだけです

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(FeignException.class)
    public String handleFeignStatusException(FeignException e, HttpServletResponse response) {
        response.setStatus(e.status());
        return "feignError";
    }

}

この例では、Springが受け取ったのと同じHTTPステータスを返します。

1
Srinath