java - propiedades - ¿Cómo inyectar un mapa usando la anotación Spring @Value?
leer properties java spring (6)
Así es como lo hicimos. Dos clases de muestra de la siguiente manera:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
@EnableKafka
@Configuration
@EnableConfigurationProperties(KafkaConsumerProperties.class)
public class KafkaContainerConfig {
@Autowired
protected KafkaConsumerProperties kafkaConsumerProperties;
@Bean
public ConsumerFactory<String, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(kafkaConsumerProperties.getKafkaConsumerConfig());
}
...
@Configuration
@ConfigurationProperties
public class KafkaConsumerProperties {
protected Map<String, Object> kafkaConsumerConfig = new HashMap<>();
@ConfigurationProperties("kafkaConsumerConfig")
public Map<String, Object> getKafkaConsumerConfig() {
return (kafkaConsumerConfig);
}
...
Para proporcionar la configuración de kafkaConsumer desde un archivo de propiedades, puede usar: mapname [key] = value
//application.properties
kafkaConsumerConfig[bootstrap.servers]=localhost:9092, localhost:9093, localhost:9094
kafkaConsumerConfig[group.id]=test-consumer-group-local
kafkaConsumerConfig[value.deserializer]=org.apache.kafka.common.serialization.StringDeserializer
kafkaConsumerConfig[key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
Para proporcionar la configuración kafkaConsumer de un archivo yaml, puede usar "[clave]": valor en el archivo application.yml:
kafkaConsumerConfig:
"[bootstrap.servers]": localhost:9092, localhost:9093, localhost:9094
"[group.id]": test-consumer-group-local
"[value.deserializer]": org.apache.kafka.common.serialization.StringDeserializer
"[key.deserializer]": org.apache.kafka.common.serialization.StringDeserializer
¿Cómo puedo inyectar valores en un Mapa desde el archivo de propiedades usando la anotación @Value en Spring?
Mi clase de Spring Java es e intenté usar el $ pero recibí el siguiente mensaje de error
No se pudo conectar automáticamente el campo: privado java.util.Map Test.standard; la excepción anidada es java.lang.IllegalArgumentException: no se pudo resolver el marcador de posición ''com.test.standard'' en el valor de cadena "$ {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;
}
Tengo las siguientes propiedades en un archivo .properties
com.test.standard.name1=Pattern1
com.test.standard.name2=Pattern2
com.test.standard.name3=Pattern3
com.hello.foo.enabled=true
Creo que Spring Boot admite la carga de mapas de propiedades fuera de la caja con la anotación @ConfigurationProperties .
Según los documentos, puede cargar propiedades:
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
en frijol como este:
@ConfigurationProperties(prefix="my")
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
Utilicé la función @ConfigurationProperties antes, pero sin cargar en el mapa. Debe usar la anotación @EnableConfigurationProperties para habilitar esta función.
Lo bueno de esta característica es que puede validar sus propiedades .
Para que esto funcione con YAML, haga esto:
@Bean(name = "mongoConfig")
@ConfigurationProperties(prefix = "spring.data.mongodb")
public Map<String, Map<String, String>> mongoConfig() {
return new HashMap();
}
Puede inyectar
.properties
como un mapa en su clase utilizando la anotación
@Resource
.
Si está trabajando con una
XML based configuration
,
agregue el siguiente bean en su archivo de configuración de Spring:
<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:your.properties"/>
</bean>
Para, Anotación basada:
@Bean(name = "myProperties")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource(
"your.properties"));
return bean;
}
Luego puede recogerlos en su aplicación como un Mapa:
@Resource(name = "myProperties")
private Map<String, String> myProperties;
Puede inyectar valores en un Mapa desde el archivo de propiedades utilizando la anotación
@Value
como esta.
La propiedad en el archivo de propiedades.
propertyname={key1:''value1'',key2:''value2'',....}
En su código
@Value("#{${propertyname}}") private Map<String,String> propertyname;
Tenga en cuenta el hashtag como parte de la anotación.
Tenía un código simple para Spring Cloud Config
Me gusta esto:
En application.properties
spring.data.mongodb.db1 = mongodb: //[email protected]
spring.data.mongodb.db2 = mongodb: //[email protected]
leer
@Autowired
@Qualifier(value = "mongoConfig")
private Map<String, String> mongoConfig;
@Bean(name = "mongoTemplates")
public HashMap<String, MongoTemplate> mongoTemplateMap() throws UnknownHostException {
HashMap<String, MongoTemplate> mongoTemplates = new HashMap<>();
for (Map.Entry<String, String>> entry : mongoConfig.entrySet()) {
String k = entry.getKey();
String v = entry.getValue();
MongoTemplate template = new MongoTemplate(new SimpleMongoDbFactory(new MongoClientURI(v)));
mongoTemplates.put(k, template);
}
return mongoTemplates;
}
utilizar
property-name: ''{
key1: "value1",
key2: "value2"
}''