Is it possible to inject below yaml file to Spring Boot application as Map<String, Map<String, String>
where tradeType
will be the key of outer map and P and B will be the key value for inner map for.
tradeType:
P: B
S: S
securityCode:
ICI: ICICI Bank
BOB: Bank of Baroda
BOA: Bank of America
BOS: Bank of Singapore
As suggested this is how my class look.
@Configuration
@PropertySource("file:data/referenceDataMapping.yaml")
@ConfigurationProperties(prefix = "map")
public class ReferenceDataMapping {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private Map<String, Map<String, String>> entries;
@Override
public String toString() {
if (entries != null) {
logger.info(entries.toString());
return entries.toString();
} else {
return null;
}
}
public Map<String, Map<String, String>> getEntries() {
return entries;
}
public void setEntries(Map<String, Map<String, String>> entries) {
this.entries = entries;
}
}
from build.gradle
dependencies {
compile 'org.springframework.boot:spring-boot-starter-activemq:2.1.2.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-security:2.1.2.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-web:2.1.2.RELEASE'
compile 'org.apache.camel:camel-spring-boot-starter:2.23.1'
compile 'org.apache.camel:camel-quartz2:2.23.1'
compile 'org.apache.camel:camel-jms:2.23.1'
compile 'org.apache.camel:camel-jacksonxml:2.23.1'
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
compile 'net.sf.saxon:Saxon-HE:9.9.1-1'
testCompile 'org.springframework.boot:spring-boot-starter-test:2.1.2.RELEASE'
testCompile 'org.springframework.security:spring-security-test:5.1.3.RELEASE'
}
referenceDataMapping.yaml
map:
entries:
tradeType:
P: B
S: S
securityCode:
ICI: ICICI Bank
BOB: Bank of Baroda
BOA: Bank of America
BOS: Bank of Singapore
Yes . It is possible.
@Configuration
@ConfigurationProperties(prefix="map")
public class Test {
private Map<String,Map<String,String>> entires;
public Map<String, Map<String, String>> getEntires() {
return entires;
}
public void setEntires(Map<String, Map<String, String>> entires) {
this.entires = entires;
}
}
application.yml :
map:
entires:
tradeType:
P: B
S: S
securityCode:
ICI: ICICI Bank
BOB: Bank of Baroda
BOA: Bank of America
BOS: Bank of Singapore
output:
{tradeType={P=B, S=S}, securityCode={ICI=ICICI Bank, BOB=Bank of Baroda, BOA=Bank of America, BOS=Bank of Singapore}}
Update:
As described in this github-issue . @PropertySource doesnt support yaml files . In that case, kindly follow this guide PropertySource-with-yaml-files
If the YAML is in different file than application.yml,
@Component
public class YourClass {
private Map<String, String> tradeType;
private Map<String, String> securityCode;
public Map<String, String> getTradeType() {
return tradeType;
}
public Map<String, String> getSecurityCode() {
return securityCode;
}
@PostConstruct
public void yamlFactory() {
YamlMapFactoryBean factory = new YamlMapFactoryBean();
factory.setResources(new ClassPathResource("your.yml"));
tradeType = (Map<String, String>) factory.getObject().get("tradeType");
securityCode = (Map<String, String>) factory.getObject().get("securityCode");
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.