Mencetak semua properti yang disetel melalui Spring PropertyPlaceholderConfigurer

Saya ingin mencetak daftar konsolidasi properti yang diatur dalam aplikasi kita saat startup. Apa cara terbaik untuk melakukan ini?

Terima kasih


person Darth Ninja    schedule 28.11.2011    source sumber
comment
Kemungkinan duplikat Spring: akses semua properti Lingkungan sebagai objek Peta atau Properti   -  person Cherry    schedule 29.05.2017


Jawaban (3)


Gunakan khusus PropertyPlaceholderConfigurer implementasi yang menggantikan metode resolve... dan mencatat nama placeholder. Anda mungkin juga perlu/ingin mengganti metode convert..., tetapi resolve... harus menanganinya.

person Dave Newton    schedule 28.11.2011

Ini implementasi saya:

public class CustomPropertySourcesPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer implements InitializingBean{

    public void afterPropertiesSet(){
        try{
            Properties loadedProperties = this.mergeProperties();
            for(Entry<Object, Object> singleProperty : loadedProperties.entrySet()){
                logger.info("LoadedProperty: "+singleProperty.getKey()+"="+singleProperty.getValue());
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
person fl4l    schedule 19.01.2014
comment
kelas dasar tidak memiliki metodenya - person Daneel Yaitskov; 19.10.2016
comment
Kelemahan solusi Anda - jika ada properti yang mengalami kesalahan - Anda tidak akan pernah melihat semua properti ini di file log karena afterPropertiesSet() tidak akan dipanggil. - person rauch; 12.12.2016
comment
Tidak berfungsi untuk saya, tidak ada properti dalam daftar sama sekali. - person Daniel Hári; 01.03.2017

Berikut adalah contoh nyata pencetakan semua properti:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.web.context.support.StandardServletEnvironment;

public class PropertiesLoaderConfigurer
    extends PropertySourcesPlaceholderConfigurer {

    private static final String ENVIRONMENT_PROPERTIES = "environmentProperties";

    @Override
    public void postProcessBeanFactory(
        final ConfigurableListableBeanFactory beanFactory)
        throws BeansException {

        super.postProcessBeanFactory(beanFactory);

        final StandardServletEnvironment propertySources =
            (StandardServletEnvironment) super.getAppliedPropertySources().get(ENVIRONMENT_PROPERTIES).getSource();

        propertySources.getPropertySources().forEach(propertySource -> {
            if (propertySource.getSource() instanceof Map) {
                // it will print systemProperties, systemEnvironment, application.properties and other overrides of
                // application.properties
                System.out.println("#######" + propertySource.getName() + "#######");

                final Map<String, String> properties = mapValueAsString((Map<String, Object>) propertySource.getSource());
                System.out.println(properties);
            }
        });
    }

    private Map<String, String> mapValueAsString(
        final Map<String, Object> map) {

        return map.entrySet().stream()
            .collect(Collectors.toMap(entry -> entry.getKey(), entry -> toString(entry.getValue())));
    }

    private String toString(
        final Object object) {

        return Optional.ofNullable(object).map(value -> value.toString()).orElse(null);
    }
}
person amgohan    schedule 15.04.2016
comment
Kelemahan dari solusi ini adalah ia mencetak semua pemetaan properti sumber secara individual yang mungkin merupakan nilai duplikat untuk kunci yang diganti alih-alih hanya mencetak nilai hasil untuk semua properti. - person Daniel Hári; 01.03.2017