Spring两个不同的应用程序上下文 - 属性占位符冲突

时间:2016-06-17 23:04:25

标签: java spring dependency-injection spring-boot

我已经使用将要使用的Spring框架创建了一个SDK 与REST后端集成,以利用依赖注入。

在此SDK中,我MapPropertySources来处理PropertyPlaceHolders。 基本上我以编程方式注册我想要的一些属性 要在SDK中使用@Value注释进行解析。

它在SDK中运行良好,但是当我构建SDK时(使用构建器) 在Spring-boot应用内,来自MapPropertiesPlaceHolder的属性 不再解决了。

我有来自构建器类的这段代码:

    public MyRepository build() {


    AnnotationConfigApplicationContext context =
            new AnnotationConfigApplicationContext();

    StandardEnvironment env = new StandardEnvironment();
    context.setEnvironment(env);


    Map<String, Object> propertiesMap = new HashMap<>();
    propertiesMap.put("baseUrl", baseUrl);

    MutablePropertySources mutablePropertySources = context.getEnvironment().getPropertySources();
    mutablePropertySources.addFirst(new MapPropertySource("customPropertiesMap", propertiesMap));


    if(jerseyClient == null){
        jerseyClient = JerseyClientBuilder.createClient();
    }

    context.getBeanFactory().registerSingleton("jerseyClient", jerseyClient);

    context.setParent(null);
    context.register(MySdk.class);
    context.refresh();

    MySdk mySdk = new MySSdk(context);

    return mySdk;
}

这是我实例化SDK的方式,我创建了一个新的 里面的Spring上下文。

问题是MapPropertySource内的属性 当我将SDK用作另一个中的maven依赖时,未解析 spring-boot申请。它可能与父母有任何关系 背景?这些属性尚未解决......我应该在哪里进行调查?

问题很长,我在SDK测试中解析了@Value('${baseUrl}),但是当我将此SDK包含在另一个spring-boot应用程序中时,它将不再被解析。为什么呢?

编辑:

MySdk课程如下所示:

@ComponentScan
@Service
@PropertySource("classpath:application.properties")
public class DeviceRepository {

    private ApplicationContext context;

    public MySdk(){
    }

    public MySdk(ApplicationContext context) {
        this.context = context;
    }
    // other methods that calls beans from context like
    // this.context.getBean(MyBean.class).doSomething()

在同一个SDK中的测试中,一切正常。该 baseUrl属性解析得很好,但是当我将此SDK连接到另一个时 spring应用程序,在构建器中传递的属性,它们不是 由@Value注释识别。

2 个答案:

答案 0 :(得分:1)

您是否在Spring配置中定义了PropertySourcesPlaceholderConfigurer bean?每当属性解析在@Value注释内失败时,这是首先想到的事情之一。

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

链接到Javadoc:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/PropertySourcesPlaceholderConfigurer.html

答案 1 :(得分:0)

嗯,刚刚阅读了一些关于利用属性占位符来利用java配置的有趣内容。看看这个链接#3。看起来你必须注册另一个bean。

http://www.baeldung.com/2012/02/06/properties-with-spring/

另外值得注意的是,有关儿童与父母情境的整体范围讨论。我不相信你可以在没有建立这种关系的情况下有两种情境。