24

Come posso inserire valori in una mappa dal file delle proprietà utilizzando l'annotazione @Value in primavera?Come iniettare una mappa usando la @Value Spring Annotation?

classe

La mia primavera Java è e Ho provato ad utilizzare il $, ma, ha ottenuto il seguente messaggio di errore

Impossibile autowire campo: private java.util.Map Test.standard; l'eccezione annidata è java.lang.IllegalArgumentException: Impossibile risolvere segnaposto 'com.test.standard' nel valore stringa "$ {} 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; 

} 

Ho le seguenti proprietà in una. file delle proprietà

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

Sarà necessario utilizzare il linguaggio di espressione primaverile. Una domanda simile che ha usato la lista (https://stackoverflow.com/questions/27390363/spring-how-to-inject-an-inline-list-of-strings-using-value-annotation). Non sono sicuro che tu possa fare ciò che vuoi fuori dagli schemi. Questa domanda https: // StackOverflow.it/questions/28369458/how-to-fill-hashmap-from-java-property-file-with-spring-value è un po 'più importante per te. Utilizza un mappatore di proprietà personalizzato –

+0

Che cosa vuoi esattamente nella tua mappa? Sembra che ti aspetti anche qualche tipo di conversione ad un 'Pattern'? Che tipo di classe 'Pattern' è quella? –

+0

@Erlandsson questo è un pattern RegEx, definiremo stringhe di espressioni regolari valide nel valore – yathirigan

risposta

10

Credo che Spring Boot supporti il ​​caricamento delle mappe di proprietà con la nota @ConfigurationProperties.

Secondo che documenti è possibile caricare le proprietà:

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

in fagiolo in questo modo:

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

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

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

ho usato @ConfigurationProperties funzione prima, ma senza caricare nella mappa. È necessario utilizzare @EnableConfigurationProperties annotation per abilitare questa funzione.

Le cose interessanti su questa funzione sono che è possibile validate your properties.

+0

sì, ma il mio problema è .. La classe Test ha il proprio prefisso @ConfigurationProperties. Quindi voglio usare un prefisso diff per questa variabile membro da solo. Come lo posso fare ? – yathirigan

+1

hmm, mi sono perso. Quindi creerei due bean separati con l'annotazione @ConfiguraitonProperties e li autowire nella classe di test. – luboskrnac

+0

bella idea .. Proverò questo .. – yathirigan

7

È possibile iniettare .properties come una mappa nella tua classe con @Resource annotazione.

Se si lavora con XML based configuration, quindi aggiungere al di sotto di fagioli nel file di configurazione di primavera:

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

Per, Annotazione base:

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

Poi li si può prendere nell'applicazione come Mappa:

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

Abbiamo utilizzato il server Spring Cloud Config per fornire le configurazioni, quindi l'approccio del percorso di classe potrebbe non funzionare. E non usiamo XML – yathirigan

52

È possibile inserire valori in una mappa dal file delle proprietà utilizzando l'annotazione @Value come questa.

La proprietà nel file delle proprietà.

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

Nel codice.

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

Annotare l'hashtag come parte dell'annotazione.

+1

devono essere virgolette, altrimenti ottengo un 'SpelEvaluationException' –

+2

Come impostare il valore predefinito se la proprietà è assente per evitare che si verifichi un'eccezione? – okwap

+0

Se si desidera utilizzare stringhe con spazi bianchi (ad es. _USB Camera 0xfd120000046d0819_) come chiavi, utilizzare virgolette singole come valori. – partTimeNinja

Problemi correlati