Могу ли я настроить URL-адрес @FeignClient, используя файл properties/yml с пользовательским именем свойства?

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

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

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

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);
    }
}
Другие вопросы по тегам