gpt4 book ai didi

java - 合并Spring引用的多个属性文件

转载 作者:行者123 更新时间:2023-12-04 03:59:59 28 4
gpt4 key购买 nike

我的 Spring 配置如下所示:

<jee:remote-slsb id="ejb1"
jndi-name="org.example.Ejb1"
business-interface="org.example.Ejb1"
environment-ref="ejb1Properties">
</jee:remote-slsb>
<util:properties id="ejb1Properties" location="classpath:ejb1.properties"/>

<jee:remote-slsb id="ejb2"
jndi-name="org.example.Ejb2"
business-interface="org.example.Ejb2"
environment-ref="ejb2Properties">
</jee:remote-slsb>
<util:properties id="ejb2Properties" location="classpath:ejb2.properties"/>

...因为这两个 EJB 可能使用不同的 JNDI URL、不同的上下文工厂和身份验证凭据。 ejb1.properties 和 ejb2.properties 具有相同名称的属性,但具有不同的值:
ejb1.properties:
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://example1:7101
java.naming.security.principal=id1
java.naming.security.credential=foo

ejb2.properties:
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://example2:7101
java.naming.security.principal=id2
java.naming.security.credential=bar

但是,我希望我的用户维护一个属性文件,而不是两个。

很明显,编写一个启动脚本来从核心属性文件生成 ejb1.properties 和 ejb2.properties 很容易。但是有没有办法让 Spring 从单个文件中获取属性,并适本地映射名称?

最佳答案

AFAIK,Spring 中没有任何东西可以处理您的情况。但是,一种直接的解决方案是扩展 PropertiesFactoryBean 并覆盖 mergeProperties() 方法。这是基于名称前缀过滤属性条目的此类扩展的示例:

public class FilteringPropertiesFactoryBean extends PropertiesFactoryBean {

private String namePrefix;

@Override
protected Properties mergeProperties() throws IOException {
Properties unfilteredProperties = super.mergeProperties();

Properties filteredProperties = new Properties();

// iterator over keys
// discard entries whose key doesn't start with prefix
for (Object key : unfilteredProperties.keySet()) {
String name = key.toString();

// trim the property name by removing the target prefix.
String trimmedName = trimName(name);
if (trimmedName != null) {
// add the property to the filtered collection
String value = unfilteredProperties.getProperty(name);
filteredProperties.setProperty(trimmedName, value);
}
}

return filteredProperties;
}

public void setNamePrefix(String value) {
this.namePrefix = value;
}

private String trimName(String name) {
// does name start with the prefix and is the name longer than the prefix
if (name.startsWith(namePrefix) && name.length() > namePrefix.length()) {
return name.substring(namePrefix.length());
}
return null;
}

}

配置工厂 bean 将类似于:
<bean id="ejb1Properties" class="example.FilteringPropertiesFactoryBean">
<property name="location" value="classpath:merged.properties"/>
<property name="namePrefix" value="ejb1."/>
</bean>

使用上述配置和一个包含以下内容的 merge.properties 文件:
ejb1.java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
ejb1.java.naming.provider.url=t3://example1:7101
ejb1.java.naming.security.principal=id1
ejb1.java.naming.security.credential=foo

ejb2.java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
ejb2.java.naming.provider.url=t3://example2:7101
ejb2.java.naming.security.principal=id2
ejb2.java.naming.security.credential=bar

FilteringPropertiesFactoryBean#mergeProperties() 返回的结果属性是(注意前缀是从最终属性名称中去除的):
java.naming.factory.initial = weblogic.jndi.WLInitialContextFactory
java.naming.provider.url = t3://example1:7101
java.naming.security.principal = id1
java.naming.security.credential = foo

关于java - 合并Spring引用的多个属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11136012/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com