他のマイクロサービスにリクエストを送信するためにいくつかの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 コードを取得しましたが、関数でどのように使用できるか正確にわかりません。
あなたはあなたの偽のクライアントにFallbackFactoryを実装しようとしましたか?
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)
}
};
}
}
同じ問題ではありませんが、これは私の状況で役立ちました。 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ステータスを返します。