2017-01-21 9 views
-1

Я использую Spring Boot 1.4.3 и новые свойства безопасности. В настоящее время я весна успешно/автомагически отображение нескольких свойств, таких как my.nested.thing1 к классу, как показано ниже:Spring Boot @ConfigurationProperties - программным путем получить все ключи свойств?

@ConfigurationProperties(prefix="my") 
public class My { 
    Nested nested = new Nested(); 
    public static class Nested { 
     String thing1; 
     String thing2; 
     //getters and setters.... 
    } 
} 

Мой вопрос, как я могу программно перечислить все возможные свойства в @ConfigurationProperties классе? Подобно тому, как Spring перечисляет все общие свойства в https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html. Я хотел бы напечатать:

my.nested.thing1 
my.nested.thing2 

Сейчас я поддерживать список вручную, но это делает его очень трудно, когда мы добавить или изменить свойства.

ответ

0

Фигурные это после того, как копаться Spring загрузки исходного кода:

@PostConstruct 
public void printTheProperties() { 
    String prefix = AnnotationUtils.findAnnotation(My.class, ConfigurationProperties.class).prefix(); 
    System.out.println(getProperties(My.class, prefix)); 
} 

/** 
* Inspect an object recursively and return the dot separated property paths. 
* Inspired by org.springframework.boot.bind.PropertiesConfigurationFactory.getNames() 
*/ 
private Set<String> getProperties(Class target, String prefix) { 
    Set<String> names = new LinkedHashSet<String>(); 
    if (target == null) { 
     return names; 
    } 
    if (prefix == null) { 
     prefix = "" ; 
    } 
    PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(target); 
    for (PropertyDescriptor descriptor : descriptors) { 
     String name = descriptor.getName(); 
     if (name.equals("class")) { 
      continue; 
     } 
     if (BeanUtils.isSimpleProperty(descriptor.getPropertyType())) { 
      names.add(prefix + "." + name); 
     } else { 
      //recurse my pretty, RECURSE! 
      Set<String> recursiveNames = getProperties(descriptor.getPropertyType(), prefix + "." + name); 
      names.addAll(recursiveNames); 
     } 

    } 
    return names; 
}