4

私の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"/>

... 2 つの 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

ただし、ユーザーには、2 つではなく 1 つのプロパティ ファイルを保持してもらいたいと考えています。

明らかに、コア プロパティ ファイルから ejb1.properties および ejb2.properties を生成する起動スクリプトを作成するのは簡単です。しかし、名前を適切にマッピングして、Spring に単一のファイルからプロパティを取得させる方法はありますか?

4

1 に答える 1

6

私の知る限り、Springにはあなたの状況を処理するものは何もありません。ただし、1 つの簡単な解決策は、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>

上記の構成と、以下を含む merged.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
于 2012-06-29T18:38:11.313 に答える