3

アプリケーションを少なくとも1つの以前のバージョンと下位互換性を持たせようとしています。私が抱えている最大の問題は、古いプロパティファイルに存在しない予想されるプロパティです。

たとえば、古いプロパティファイルが次のようになっているとします。

prop.old=some text

新しいプロパティファイルは次のようになります。

prop.old=some text
prop.new=some new text

また、新しいapp-context.xmlの関連セクションは次のようになります。

<beans:bean id="myClass" class="com.mycompany.MyClass">
    <beans:property name="oldThing" value="${prop.old}" />
    <beans:property name="newThing" value="${prop.new}" />
</beans:bean>

明らかに、これは実行時に爆発します。プロパティが存在するかどうかを確認し、存在しない場合は代わりに空の文字列を使用する方法はありますか?

4

2 に答える 2

2

3.0以降では、ignore-unresolvable=trueを使用できます。PropertyPlaceholderConfigurer

<context:property-placeholder ignore-unresolvable="true" />
于 2012-10-18T19:23:06.743 に答える
0

欠落しているプロパティを無視しようとすると、欠落しているプロパティが必須であるかオプションであるかがわからないため、注意が必要です。だから私はそれを行うためのプログラム的な方法を好みます。

まず、プロパティファイルにアクセスするための基本クラスを用意します。

public abstract class ClasspathProperties {

    private final Environment environment;

    public ClasspathProperties(final Environment environment, final String propertiesLocation) {
        try {
            final PropertySource<?> propertySource = new ResourcePropertySource(propertiesLocation);
            verifyProperties(propertySource);
            ((ConfigurableEnvironment) environment).getPropertySources().addFirst(propertySource);
            this.environment = environment;
        } catch (final IOException e) {
            throw new IllegalStateException("reading properties from location " + propertiesLocation + " failed", e);
        }
    }

    public Environment getEnvironment() {
        return environment;
    }

    protected abstract void verifyProperties(PropertySource<?> propertySource);

    protected void verifyPropertyExistence(final PropertySource<?> propertySource, final String propertyName,
            final String propertyDescription) {
        final Object propertyValue = propertySource.getProperty(propertyName);
        if (propertyValue == null || "".equals(propertyValue)) {
            throw new IllegalStateException(propertyDescription + " is not set");
        }
    }

}

次に、指定されたプロパティファイルを読み取り、プロパティを設定する前に検証することができます。

public class ClasspathDatabaseProperties extends ClasspathProperties implements DatabaseProperties {

    public ClasspathDatabaseProperties(final Environment environment) {
        this(environment, "classpath:/config/db-config.properties");
    }

    public ClasspathDatabaseProperties(final Environment environment, final String propertiesLocation) {
        super(environment, propertiesLocation);
    }

    @Override
    protected void verifyProperties(final PropertySource<?> propertySource) {
        verifyPropertyExistence(propertySource, "mysql.host", "MySQL DB host");
        verifyPropertyExistence(propertySource, "mysql.port", "MySQL DB port");
        verifyPropertyExistence(propertySource, "mysql.database", "MySQL DB DB name");
        verifyPropertyExistence(propertySource, "mysql.username", "MySQL DB username");
        verifyPropertyExistence(propertySource, "mysql.password", "MySQL DB password");
    }

    @Override
    public String getHost() {
        return getEnvironment().getProperty("mysql.host");
    }

    @Override
    public int getPortNumber() {
        return getEnvironment().getProperty("mysql.port", Integer.class);
    }

    @Override
    public String getDatabase() {
        return getEnvironment().getProperty("mysql.database");
    }

    @Override
    public String getUsername() {
        return getEnvironment().getProperty("mysql.username");
    }

    @Override
    public String getPassword() {
        return getEnvironment().getProperty("mysql.password");
    }

}

キーを解決できない場合、getProperty(String key)はnullを返します。

于 2012-10-18T23:27:31.370 に答える