問題を解決しようとしています。私たちはプロパティをデータベースに保存しています。アプリケーションが起動すると、コード全体に複数の "@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
*複数の*もの:1)注釈の値はコンパイル時定数でなければなりません。連結はコンパイル時定数として解釈されません。 2)なぜあなたは古いバージョンのSpringで動かないのですか? – Makoto
@Makoto Concatenations *はコンパイル時定数ですが、これは列ではなく列挙です。 – chrylis
上記の方法よりもこれを行う方が良いでしょうか? – schu777