문제를 해결하려고합니다. 우리는 데이터베이스에 속성을 저장하고 있으며 응용 프로그램이 시작되면 코드 전체에 "@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);
}
}
}
위의 "특성"-이 열거 형입니다.
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가 많이 있습니다. 우리는 단위 테스트를 돕기 위해 모든 것을 담을 클래스를 만들었지 만, 코드를 통해 흩어져있는 대신 한 곳에서 모두 가져 오는 것이 좋습니다. 그래서 이것을하고 싶습니다. 그러나 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을 사용
* 여러 가지 * 1) 주석에 대한 값은 컴파일 타임 상수 여야합니다. 연결은 컴파일 타임 상수로 해석되지 않습니다. 2) 왜 당신은 옛 버전의 스프링에 갇혀 있습니까? – Makoto
@Makoto Concatenations *는 컴파일 타임 상수입니다. 그러나 이것은 문자열이 아니라 enum입니다. – chrylis
위의 방법보다 더 나은 방법이 있습니까? – schu777