24

İlkbaharda @Value açıklamalarını kullanarak özellikler dosyasındaki bir Haritaya değerleri nasıl enjekte edebilirim?@Value Spring Annotation kullanarak bir harita nasıl enjekte edilir?

Benim Bahar Java sınıfı ve ben $ kullanılarak çalıştı ama, aşağıdaki hata iletisini

var

alan autowire Could : Özel java.util.Map Test.standard; İç içe istisna java.lang.IllegalArgumentException geçerli: yer tutucu dize değeri 'com.test.standard' "$ {com.test.standard}" çözülemedi

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

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

    private String enabled; 

} 

Ben aşağıdaki özelliklere sahiptir. özellikleri Sen @Resource ek açıklama kullanarak sınıfta bir harita olarak .properties enjekte edebilir

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

Yay ifade dilini kullanmanız gerekir. Kullanılan listenin benzeri bir soru (https://stackoverflow.com/questions/27390363/spring-how-to-inject-an-inline-list-of-strings-using-value-annotation). Kutunun dışında istediğini yapabileceğinden emin değilim. Bu soru https: // stackoverflow.com/questions/28369458/nasıl-doldurma-hashmap-from-java-özellik-dosya-ile-bahar-değeri sizin noktanız biraz daha fazla. Özel özellik eşleyicisi kullanır –

+0

Haritanızda tam olarak ne istiyorsunuz? Görünüşe göre bir "Pattern" türünde bir tür konuşmayı bekliyorsunuz? Bu ne tür bir 'Desen' sınıfı? –

+0

@Erlandsson bu bir RegEx modelidir, geçerli regex desen dizelerini – yathirigan

cevap

10

Spring Boot'un, @ConfigurationProperties ek açıklamaları ile birlikte harita özelliklerini yükleme özelliklerini desteklediğine inanıyorum.

dokümanlar olduğunu göre sen özelliklerini yükleyebilirsiniz:

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

fasulye içine böyle:

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

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

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

Ben @ConfigurationProperties önce özelliği, ancak haritaya yüklemeden kullanılır. Bu özelliği etkinleştirmek için @EnableConfigurationProperties annotation kullanmanız gerekir.

Bu özellik hakkında güzel şeyler validate your properties yapabilirsiniz.

+0

evet, ama benim sorunum ... Test sınıfının kendi @ConfigurationProperties öneki var. Bu yüzden bu üye değişkeni için bir diff öneki kullanmak istiyorum. bunu nasıl yapabilirim ? – yathirigan

+1

hmm, bunu özledim. Bu yüzden, @ConfiguraitonProperties notu ile ayrı iki fasülye oluşturabilir ve bunları test sınıfına otomatikleştirebilirim. – luboskrnac

+0

güzel bir fikir .. Bunu deneyeceğim .. – yathirigan

7

dosya.

Eğer XML based configuration ile çalışıyorsanız, ardından bahar yapılandırma dosyasında çekirdeği altında ekleyin:

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

esaslı, Annotation için:

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

Sonra onları alabilirsiniz Uygulamanızdaki bir Harita olarak:

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

Konfigürasyonları sağlamak için Spring Cloud Config sunucusunu kullandık, dolayısıyla sınıf yolu yaklaşımı çalışmayabilir. Ve biz XML'leri kullanmıyoruz – yathirigan

52

Bu gibi @Value ek açıklamalarını kullanarak özellikler dosyasındaki bir Haritaya değerler enjekte edebilirsiniz.

Özellikler dosyasındaki özellik. Kodunuzda.

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

Ek notu notun bir parçası olarak not edin.

+1

değerleri tırnak işareti olmalı, yoksa bir SpelEvaluationException aldım –

+2

Özel durum önlemek için özellik yoksa, varsayılan değer nasıl ayarlanır? – okwap

+0

Beyaz boşluklu dizeleri (ör. _USB Camera 0xfd120000046d0819_) anahtar olarak kullanmak isterseniz, değerler için tek tırnak kullanın. – partTimeNinja

İlgili konular