2015-04-12 31 views
16

Wiosenny rozruch zapewnia wiele ciekawych funkcji. Moim ulubionym jest bezpieczny mechanizm konfiguracji poprzez @ConfigurationProperties i odpowiednie pliki yml/properties. Piszę bibliotekę, która konfiguruje połączenie Cassandra za pomocą sterownika Datastax Java. Chcę zezwolić programistom na konfigurowanie obiektów Cluster i Session poprzez proste edytowanie pliku yml. To jest łatwe w wiosennym bucie. Ale chcę pozwolić jej/on skonfigurować wiele połączeń w ten sposób. W ramach PHP - Symfony jest to tak proste, jak:Spring Boot - nesting ConfigurationProperties

doctrine: 
    dbal: 
    default_connection: default 
    connections: 
     default: 
     driver: "%database_driver%" 
     host:  "%database_host%" 
     port:  "%database_port%" 
     dbname: "%database_name%" 
     user:  "%database_user%" 
     password: "%database_password%" 
     charset: UTF8 
     customer: 
     driver: "%database_driver2%" 
     host:  "%database_host2%" 
     port:  "%database_port2%" 
     dbname: "%database_name2%" 
     user:  "%database_user2%" 
     password: "%database_password2%" 
     charset: UTF8 

(ten fragment pochodzi z Symfony documentation)

Czy to możliwe, na wiosnę-boot z wykorzystaniem ConfigurationProperties? Czy mam je zagnieździć?

+0

Jestem prawie pewien, że nie można wpisywać - bezpiecznie zagnieżdżać dowolne liczby podobiektów (takich jak twoje "połączenia"), chociaż możliwe jest, że będziesz w stanie zadeklarować 'Map connections'. Jeśli to nie zadziała, być może zgłoś prośbę o funkcję na GitHub. – chrylis

Odpowiedz

23

W rzeczywistości można użyć zagnieżdżonego typu ConfigurationProperties.

@ConfigurationProperties 
public class DatabaseProperties { 

    private Connection primaryConnection; 

    private Connection backupConnection; 

    // getter, setter ... 

    public static class Connection { 

     private String host; 

     // getter, setter ... 

    } 

} 

Teraz możesz ustawić właściwość primaryConnection.host.

Jeśli nie chcesz korzystać z klas wewnętrznych, możesz opisać pola za pomocą @NestedConfigurationProperty.

@ConfigurationProperties 
public class DatabaseProperties { 

    @NestedConfigurationProperty 
    private Connection primaryConnection; // Connection is defined somewhere else 

    @NestedConfigurationProperty 
    private Connection backupConnection; 

    // getter, setter ... 

} 

Zobacz także Reference Guide i Configuration Binding Docs.

+1

Od wiosny rozruchu 1.3.0.RELEASE, klasa wewnętrzna musi być publiczna, w przeciwnym razie dostanę java.lang.IllegalAccessException: Class org.springframework.beans.BeanUtils nie może uzyskać dostępu do elementu klasy ... DatabaseProperties $ Connection z modyfikatorami "prywatny" –

+0

Jak będzie getter i seter dla zwykłej klasy (klasy nie-wewnętrznej)? – kamal

+0

Są to zwykłe getter i seter, tak samo jak w klasach wewnętrznych. Jeśli chcesz ustawić właściwość 'primaryConnection.host', Spring wywoła dla Ciebie' getPrimaryConnection(). SetHost (wartość) '(bardzo abstrakcyjna i wewnętrznie może nie jest poprawna) –