Spring boot custom resolver для переменной класса - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь добиться чего-то вроде этого:

@Controller
public SomeController {
    @CustomConfig("var.a")
    private String varA;

    @CustomConfig("var.b")
    private String varB;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String get() {
        return varA;
    }
}

CustomConfig будет классом @Interface, который принимает один параметр-значение. Причина, по которой мы не используем @Value, заключается в том, что это будет не файл конфигурации, а API (например, https://getconfig.com/get?key=var.a). Итак, мы собираемся сделать HTTP-запрос для его внедрения.

Пока мне удается заставить что-то работать, только если varA и varB находятся внутри метода get () в качестве параметра, используя ниже в классе, который extends WebMvcConfigurerAdapter:

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    CustomConfigResolver resolver = new CustomConfigResolver();
    argumentResolvers.add(resolver);
}

А внутри CustomComfigResolver.resolveArgument () мы выполняем HTTP-запрос, но это не совсем то, что нам нужно, нам нужно, чтобы он был внедрен как переменная класса.

Есть ли у кого-нибудь опыт решения этой проблемы на уровне переменной класса?

Спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Это может работать, если вы используете @Value вместо собственной пользовательской аннотации. При этом используется встроенная среда:

@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
public class TcpIpPropertySourceConfig implements InitializingBean {

    @Autowired
    private ConfigurableEnvironment env;

    @Autowired
    private RestTemplate rest;

    public void afterPropertiesSet() {
       // Call your api using Resttemplate
        RemoteProperties props = //Rest Call here;

        // Add your source to the environment.
        MutablePropertySources sources = env.getPropertySources();
        sources.addFirst(new PropertiesPropertySource("customSourceName", props)
    }
}

То, чего вы пытаетесь достичь, становится трудным, когда вы начинаете рассматривать «несчастный» сценарий ios. Сервер недоступен / недоступен. Вы должны учесть все это описанным выше способом.

Я бы настоятельно рекомендовал вместо этого использовать Spring Cloud Config. Отличное руководство по этому вопросу можно найти здесь: https://www.baeldung.com/spring-cloud-configuration

Это обеспечивает: - перезагрузку ваших свойств @Value (), поэтому никаких пользовательских аннотаций не требуется. - Более стабильный сервер и отличная интеграция с Spring из коробки.

Лучше всего то, что легко применить Retries и Backoffs, если сервер конфигурации выходит из строя (см. { ссылка }) , Это гарантирует, что ваше приложение не просто взломает sh, когда сервер недоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...