2017-12-12 1 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); 
     } 
    } 
} 

위의 "특성"-이 열거 형입니다.

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을 사용

+0

* 여러 가지 * 1) 주석에 대한 값은 컴파일 타임 상수 여야합니다. 연결은 컴파일 타임 상수로 해석되지 않습니다. 2) 왜 당신은 옛 버전의 스프링에 갇혀 있습니까? – Makoto

+0

@Makoto Concatenations *는 컴파일 타임 상수입니다. 그러나 이것은 문자열이 아니라 enum입니다. – chrylis

+0

위의 방법보다 더 나은 방법이 있습니까? – schu777

답변

0

봄 3.2을 실행, 당신은 당신의 열거가 대신를 호출하여 상수를되지 않는 주위를 얻을 수 있습니다. 부울 값과 같은 값을 얻었는지 확인하십시오. 그렇지 않으면 문제가 발생합니다. 이 경우에만 텍스트 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

관련 문제