2017-03-10 16 views
0

複数のプロパティファイルを一緒に読み込んでプロパティの1つのソースとして使用する必要があります。 <util:properties>ではカンマ区切りのファイルリストを渡すことができ、これまでのところすべて正常に動作します。だから、次は良いです:ファイルのリストがパラメータである場合に、複数のプロパティファイルをSpring <util:properties />にロードする際の問題

<util:properties loaction="conf/file1.properties,conf/file2.properties,abc-*.properties" /> 

しかし、我々の場合には、プロパティファイルのリストが固定されておらず、それが前にロードされている別のマスタープロパティファイルから来ています。そのリストをパラメータとして<util:properties>に渡したいが、うまくいかない。

${allPropertiesFiles}

allPropertiesFiles=conf/file1.properties,conf/file2.properties,abc-*.properties 

これが原因で、ファイルの一覧でコンマで失敗したとして定義されて

<util:properties location="${allPropertiesFiles}" /> 

。それらを単一のファイル名として扱い、FileNotFoundExceptionをスローします。

春はカンマでファイルを分割しようとしますが、$ {allPropertiesFiles}を解決する前にそれが起こっているようです。たとえば、以下のようにすれば正常に動作しますが、そのリストに含まれるファイルの数がわからないため、実際的な解決策ではありません。

<util:properties location="${propFile.location1},${propFile.location2},${propFile.location3}" /> 

UPDATE:

${...}でプロパティ値を解決する前に、「」で処理し、分割での春の問題のようです。私はそれを分割するためにSpring ELを使ってみましたが、有効なELを解析することでもう一度失敗します。なぜなら、 '、'に基づいて最初にそれを壊してから式を評価するからです。以下の例は、ELの解析例外で失敗します。

<util:properties location="#{'${allPropertiesFiles}'.split(',')}" /> 

FYIこの観察はSpring 4.2.xです。どんな提案も大歓迎です。

答えて

0

だから、私は私の質問に対する解決策/回避策を発見し、ここでそれを共有したいと思います。

util:propertiescontext:property-placeholderのBeanパーサーは、locationプロパティの指定された文字列値を,で分割します。それはプロパティ解決が起こる前に起こります。したがって、カンマで区切られたプロパティファイルのリストをこれらのBeanに渡したい場合、それは機能しません。

<util:properties>を使用する代わりに、PropertiesFactoryBeanを直接使用してパラメータとして設定することにしました。これは、Bean定義がSpringでどのように構築されるかを修正し、SpringのBeanパーサーを使用していることを保証します。それから、StringResource[]に変換する、ResourceArrayPropertyEditorのカスタムバージョンを提供しました。プロパティエディタはコンマで区切られた文字列を処理し、Resource[]に変換します。ここで

は今、私のコンテキストxmlです:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 
     <property name="customEditors"> 
      <map> 
       <entry key="org.springframework.core.io.Resource[]" value="com.mycompany.CustomResourceArrayPropertyEditor"/> 
      </map> 
     </property> 
    </bean> 
    <bean id="allPropertiesFromFiles" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
      <property name="locations" value="${propertiesFile.locations}" /> 
    </bean> 

そして、ここでは私のカスタムPropertyEditorです:

public class CustomResourceArrayPropertyEditor extends ResourceArrayPropertyEditor 
{ 
    private final ResourcePatternResolver resourcePatternResolver; 

    public CustomResourceArrayPropertyEditor() 
    { 
    this(new PathMatchingResourcePatternResolver()); 
    } 

    public CustomResourceArrayPropertyEditor(ResourcePatternResolver resourcePatternResolver) 
    { 
    super(resourcePatternResolver, null); 
    this.resourcePatternResolver = resourcePatternResolver; 
    } 

    @Override 
    public void setAsText(String text) 
    { 
    String pattern = resolvePath(text).trim(); 
    String[] resourceNames = StringUtils.commaDelimitedListToStringArray(pattern); 
    List<Resource> resourceList = new ArrayList<Resource>(); 
    try { 
     for (String resourceName: resourceNames) 
     { 
     Resource[] resources = resourcePatternResolver.getResources(resourceName); 
     for (Resource res: resources) 
      resourceList.add(res); 
     } 
    } 
    catch (IOException ex) { 
     throw new IllegalArgumentException("Could not resolve resource location pattern [" + pattern + "]", ex); 
    } 

    setValue(resourceList.toArray(new Resource[0])); 
    } 
} 

私は考えることができ、他の問題を回避するには、豆やアップデートを訪問するBeanFactoryPostProcessorを作成することでしたutil:propertiesとのbean定義はString[]ではなくlocationsプロパティに対しては単にTypedStringValueを使用します。

希望します。

0

可変値を二重引用符で囲んでみましたか?小さなテストで 、これは魅力のように働いた:コンテンツと

a=1 

とb.properties:私は2つのプロパティファイル、コンテンツとa.propertiesを持って

<bean id="test" class="de.de.proptest.Test"> 
    <property name="p" ref="props" /> 
</bean> 
<util:properties location="${props}" id="props" /> 

のApplicationContext :

b=2 

JVM引数

-Dprops="file:/home/dominik/sandbox/proptest/a.properties, file:/home/dominik/sandbox/proptest/b.properties" 

は、私が(興味深いポイントにカット)以下の出力が得られます。

Mar 11, 2017 1:32:11 PM org.springframework.beans.factory.config.PropertiesFactoryBean loadProperties 
INFO: Loading properties file from URL [file:/home/dominik/sandbox/proptest/a.properties] 
Mar 11, 2017 1:32:11 PM org.springframework.beans.factory.config.PropertiesFactoryBean loadProperties 
INFO: Loading properties file from URL [file:/home/dominik/sandbox/proptest/b.properties] 
Test [p={b=2, a=1}] 
+0

プロパティファイルのリストをjvm argとして渡し、リストにコンマの後にスペースがあるため、二重引用符が必要です。私のリストは別のプロパティーファイルから来ています。私がそれを ""囲むとプロパティー値の一部になります。 – user3739116

+0

第2に、私はあなたの例を試してみましたが、リストがSpring 4.3.xでjvm argとして渡された場合にのみ私のために働きます。以前のバージョンのSpring(4.2.xなど)は、リスト内のカンマのためにまだ失敗します。今はSpring 4.2.xを使用しており、現時点ではアップグレードできません。第3に、あなたの例は 'によって読み込まれたプロパティファイルからリストを渡そうとしたときに失敗します。 Spring 4.3.xがjvm argをうまく処理しているように見えますが、その理由はわかりません。私が間違っている場合は教えてください。 – user3739116

関連する問題