2017-12-12 12 views
1

問題を解決しようとしています。私たちはプロパティをデータベースに保存しています。アプリケーションが起動すると、コード全体に複数の "@Value"があります。誰かがそのプロパティをデータベースに入れることを忘れてしまっても、アプリケーションを起動させることはできません。だから私はすべてのプロパティがアプリケーションが期待している存在するかどうかを確認するためのチェックを行うソリューションを探しています。私の現在のパスがapplicationContext.xmlをからこれを使用することです - 「AppPropertiesConfigurerは」PropertySourcesPlaceholderConfigurerを拡張し、BeanPostProcessor@Value内で列挙型を使用できますか?

上記そのクラスを拡張し、このクラスを作成している私は何をやった
<!-- Configure CH Properties --> 
<bean id="applicationPropertyConfigurer" class="com.chw.base.spring.AppPropertiesConfigurer" 
    depends-on="propertiesSessionFactory"> 
    <property name="applicationCode" value="xyz" /> 
    <property name="sessionFactory" ref="propertiesSessionFactory" /> 
    <property name="locations"> 
     <list> 
      <value>/WEB-INF/build.properties</value> 
     </list> 
    </property> 
</bean> 

を実装しています。これは、すべてのプロパティがロードされているかどうかを確認するためにチェックします。そうでない場合、エラーメッセージが記録されます。

import java.io.IOException; 
import java.util.HashMap; 
import java.util.Properties; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import com.chg.base.util.CHGProperties; 
import com.chw.base.spring.ChwPropertiesConfigurer; 
import com.chw.dbobjects.manager.PropertiesId; 


public class MyAppPropertiesConfigurer 
     extends AppPropertiesConfigurer 
{ 

    private static Log aLog = LogFactory.getLog(PxiPropertiesConfigurer.class); 
    private final String aPropertyNotValid = "Property not valid"; 
    private final String aPropertyNotFound = "Property not found"; 
    private HashMap<String, String> aPropertiesMap = new HashMap(); 

    @Override 
    protected void 
    loadProperties(Properties pProps) 
    throws IOException 
    { 
     super.loadProperties(pProps); 

     getProperties(); 

     int count = 1; 
     for (PropertiesId properties : PropertiesId.values()) 
     { 
      aLog.error("Property " + count + ":" + properties.getPropertiesName()); 
      testProperty(properties.getPropertiesName()); 
     } 
     try 
     { 
      Thread.sleep(60000); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public final void testProperty(String pKey) 
    { 
     Properties lPropertiesList = CHGProperties.getMappedProperties(); 
     Object lObject = lPropertiesList.getProperty(pKey); 
     if (lObject == null) 
     { 
      aLog.error(aPropertyNotFound + " " + pKey); 
     } 
    } 
} 

上記の "PropertiesId"への参照があります。これはこのEnumです。

public enum PropertiesId 
{ 
    CLEAR_VTD_FLAG("clear.vtd.flag"), 
    MAIL_FROM("app.mailfrom"), 
    FAKE_PROPERTY("fake.property"); 

    private final String propertiesName; 

    PropertiesId(String propertiesName) 
    { 
     this.propertiesName = propertiesName; 
    } 

    public String getPropertiesName() 
    { 
     return propertiesName; 
    } 
} 

もう一つのクラスでは、アプリケーション全体で使用される多くの@Valuesがあります。単体テストを手助けするためにすべてを収容するクラスを作成しましたが、コードを散らかすのではなく、1つの場所にすべてを置くだけでいいのです。ですから、私はこれをやりたいのですが、Eclipseはそれについて不平を言っています。これを行う簡単な方法はありますか?

@Value("${" + PropertiesId.CLEAR_VTD_FLAG + "}") 
private boolean aClearVtdFlag; 

@Value("${" + PropertiesId.CLEAR_VTD_FLAG + "}") 
private boolean aFake; 
@Value("${clear.vtd.flag:true}") 
private boolean aClearVtdFlag; 

おそらく、アプリケーションのすべてのプロパティが存在するかどうかを確認する別の方法がありますか?

おかげで、マイケル

PS:実行中の春SPELを使用して3.2

+0

*複数の*もの:1)注釈の値はコンパイル時定数でなければなりません。連結はコンパイル時定数として解釈されません。 2)なぜあなたは古いバージョンのSpringで動かないのですか? – Makoto

+0

@Makoto Concatenations *はコンパイル時定数ですが、これは列ではなく列挙です。 – chrylis

+0

上記の方法よりもこれを行う方が良いでしょうか? – schu777

答えて

0

は、あなたの代わりにそれを呼び出すことによって一定ではなく、あなたの列挙型を回避することができます。ブール値のような値を実際に得ていることを確認してください。そうしないと、問題が発生する可能性があります。これはテキストCLEAR_VTD_FLAGを返すだけです。

@Value("#{T(com.example.pkg.to.your.enum.PropertiesId).CLEAR_VTD_FLAG}") 
private boolean aClearVtdFlag; 
+0

これを試しましたが、これはエラーです 'weblogic.application.ModuleException:java.lang.IllegalArgumentException:[com.someapp.manager.PropertiesId]タイプの値を必須の型[boolean]に変換できません: PropertyEditor [org.springframework.beans.propertyeditors.CustomBooleanEditor]がタイプ[com.someapp.manager.PropertiesId]の不適切な値を返しました。 私はCLEAR_VTD_FLAGの文字列を返し、ブール値を挿入しないと考えました... – schu777

+0

@ schu777: "実際にブール値のような値を得ているか、問題が発生しているかどうかを確認してください;これはテキスト' CLEAR_VTD_FLAG'を返すだけです。 " – Makoto

関連する問題