Можно ли настроить URL @FeignClient, используя файл properties / yml с именем настраиваемого свойства? - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу использовать @FeignClient, чтобы получить URL из свойства на основе среды, в которой он запущен. как : у меня есть test, dev и prod.Все эти среды имеют разные URL для пример : test: http://localhost:9000 dev: http://localhost:8080 prod: http://localhost:8181

@FeignClient(name = "my-test-servies", url = "${com.test.my.access.url}")
@RequestMapping(method = RequestMethod.GET, value = "/authors")
public interface MyFeignClient {
  public List<Author> getAuthors();
}

Это работает, но я хочусвойство URL, которое будет изменено в зависимости от среды.Поскольку я использую один файл свойств Мой файл свойств yml выглядит следующим образом: application.yml

com:
  prod:
    my:
      access:
        url: "http://localhost:8181"
  test:
    my:
      access:
        url: "http://localhost:9000"
  dev:
    my:
      access:
        url: "http://localhost:8080"

Можно ли это сделать, и если да;как?

1 Ответ

0 голосов
/ 24 сентября 2019

Да, сделать фабрику.

Редактировать: Class<T> clazz - это интерфейс Feign.

public class FeignClientFactory {

    public static <T> T build(final String url, Class<T> clazz) {
        return Feign.builder().client(new OkHttpClient()).logger(new Slf4jLogger(clazz)).logLevel(Logger.Level.FULL)
                .encoder(new JacksonEncoder()).decoder(new JacksonDecoder()).target(clazz, url);
    }

    public static <T> T build(final String url, Class<T> clazz, ObjectMapper mapper) {
        Assert.notNull(mapper, "The mapper can't be null !");

        return Feign.builder().client(new OkHttpClient()).logger(new Slf4jLogger(clazz)).logLevel(Logger.Level.FULL)
                .encoder(new JacksonEncoder(mapper)).decoder(new JacksonDecoder(mapper)).target(clazz, url);
    }

    public static <T> T buildWithInterceptor(final String url, Class<T> clazz, RequestInterceptor interceptor) {
        return Feign.builder().client(new OkHttpClient()).logger(new Slf4jLogger(clazz)).logLevel(Logger.Level.FULL)
                .encoder(new JacksonEncoder()).requestInterceptor(interceptor).decoder(new JacksonDecoder())
                .target(clazz, url);
    }
}
...