Могу ли я настроить URL-адрес @FeignClient, используя файл properties/yml с пользовательским именем свойства?
Я хочу использовать @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 ответ
Да, сделайте фабрику.
Редактировать: 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);
}
}