24

Jak mogę wprowadzić wartości do mapy z pliku właściwości za pomocą adnotacji @Value na wiosnę?Jak wstrzyknąć mapę za pomocą adnotacji @Value Spring?

klasa

My Wiosna Java i próbowałem za pomocą $, ale mam następujący komunikat o błędzie

Nie można autowire pola: prywatny java.util.Map Test.standard; Wyjątkiem jest zagnieżdżona java.lang.IllegalArgumentException: Nie można rozwiązać zastępczy „com.test.standard” w wartości ciągu „$ {com.test.standard}”

@ConfigurationProperty("com.hello.foo") 
public class Test { 

    @Value("${com.test.standard}") 
    private Map<String,Pattern> standard = new LinkedHashMap<String,Pattern> 

    private String enabled; 

} 

Mam następujące właściwości w. właściwości pliku

com.test.standard.name1=Pattern1 
com.test.standard.name2=Pattern2 
com.test.standard.name3=Pattern3 
com.hello.foo.enabled=true 
+0

Będziesz musiał użyć języka wyrażenia wiosennego. Podobne pytanie, które wykorzystano na liście (https://stackoverflow.com/questions/27390363/spring-how-to- inject-an-inline- list-of--strings-using-value-annotation). Nie jestem pewien, czy możesz zrobić to, co chcesz, po wyjęciu z pudełka. To pytanie https: // stackoverflow.com/questions/28369458/how-to-fill-hashmap-from-java-property-file-with-spring-value jest trochę bardziej do twojego punktu. Używa niestandardowego mapera właściwości –

+0

Czego dokładnie chcesz na mapie? Wygląda na to, że spodziewasz się pewnego rodzaju konwersji do "wzoru"? Jakiego rodzaju jest to klasa "Pattern"? –

+0

@Erlandsson jest to wzorzec RegEx, zdefiniujemy poprawne ciągi wzorów regex w wartości – yathirigan

Odpowiedz

10

Wierzę, że Spring Boot obsługuje ładowanie map właściwości po wyjęciu z pudełka z adnotacją @ConfigurationProperties.

Według że docs można załadować właściwości:

my.servers[0]=dev.bar.com 
my.servers[1]=foo.bar.com 

do fasoli tak:

@ConfigurationProperties(prefix="my") 
public class Config { 

    private List<String> servers = new ArrayList<String>(); 

    public List<String> getServers() { 
     return this.servers; 
    } 
} 

użyłem @ConfigurationProperties wyposażone wcześniej, ale bez ładowania na mapie. Aby włączyć tę funkcję, musisz użyć @EnableConfigurationProperties annotation.

Fajne rzeczy na temat tej funkcji to, że możesz validate your properties.

+0

tak, ale moim problemem jest .. Klasa Test ma swój prefiks @ConfigurationProperties. Dlatego chcę używać prefiksu diff dla tej samej zmiennej składowej. jak mogę to zrobić ? – yathirigan

+1

hmm, tęskniłem za tym. Tak więc utworzyłem osobne dwa komponenty bean z adnotacją @ConfiguraitonProperties i przetworzyłem je w klasie testowej. – luboskrnac

+0

fajny pomysł .. Spróbuję tego .. – yathirigan

7

można wstrzykiwać .properties jako mapą w swojej klasie przy użyciu @Resource adnotacji.

Jeśli pracujesz z XML based configuration, następnie dodać poniżej fasoli w pliku konfiguracyjnym wiosna:

<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
     <property name="location" value="classpath:your.properties"/> 
</bean> 

Bo Adnotacja oparta:

@Bean(name = "myProperties") 
public static PropertiesFactoryBean mapper() { 
     PropertiesFactoryBean bean = new PropertiesFactoryBean(); 
     bean.setLocation(new ClassPathResource(
       "your.properties")); 
     return bean; 
} 

Następnie można je odebrać w aplikacji jako mapa:

@Resource(name = "myProperties") 
private Map<String, String> myProperties; 
+0

Użyliśmy serwera konfiguracji Spring Cloud do dostarczenia konfiguracji, dlatego podejście do ścieżki klas może nie działać. I nie używamy XMLs – yathirigan

52

Można wprowadzić wartości do mapy z pliku właściwości za pomocą adnotacji @Value.

Właściwość w pliku właściwości.

propertyname={key1:'value1',key2:'value2',....} 

W kodzie.

@Value("#{${propertyname}}") private Map<String,String> propertyname; 

Zapisz hashtag jako część adnotacji.

+1

wartości muszą być cudzysłowami, w przeciwnym razie dostaję "wyjątek SpelEvaluationException" –

+2

Jak ustawić wartość domyślną, jeśli właściwość jest nieobecna, aby zapobiec wystąpieniu wyjątku? – okwap

+0

Jeśli chcesz używać jako kluczy znaków ciągów białych (np. _USB Camera 0xfd120000046d0819_), użyj apostrofów jak dla wartości. – partTimeNinja

Powiązane problemy