可以在@Value

时间:2017-12-12 20:42:25

标签: java spring enums

我试图解决问题。我们将我们的属性存储在数据库中,当我们的应用程序启动时,我们有多个" @ Value"整个代码。如果有人忘记将该属性放入数据库,它就不会让应用程序启动。所以我正在寻找一个解决方案来检查应用程序所期望的所有属性是否存在。我当前的路径是从applicationContext.xml中使用它 - " AppPropertiesConfigurer"扩展PropertySourcesPlaceholderConfigurer并实现BeanPostProcessor

<!-- 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);
        }
    }
}

上面提到&#34; PropertiesId&#34; - 这就是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在整个应用程序中使用。我们创建了一个类来容纳所有这些以帮助进行单元测试,但是在后面看来,将它们全部放在一个地方而不是分散在代码中是很好的。所以,我想这样做,但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:运行Spring 3.2

2 个答案:

答案 0 :(得分:0)

使用SpEL,您可以通过调用它来绕过您的枚举而不是常量。确保你实际上得到类似布尔值的值,否则你将会遇到问题;这只会回复文本CLEAR_VTD_FLAG

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

答案 1 :(得分:0)

Spring映射@Value("...")enum的名称,例如:

application.properties

enum.name1="Marry"
enum.name2="John"

枚举类

public enum Name {
    Marry,
    John;
}

您要使用的地方

@Value("enum.name1")
Name name1; //name1 == Mary;
@Value("enum.name2")
Name name2; //name2 == John;

仅注意它们区分大小写。

更好的方法是使用@ConfigurationProperties