java映射POJO和Snakeyaml,名称中带下划线
我在下面的配置文件中尝试将这个yaml文件映射到带有Snakeyaml库的Java POJO类
consumers:
- acls:
- group: GRP-NAME-1
tags:
- CON-NAME
- group: GRP-NAME-2
tags:
- CON-NAME-TAG
oauth2_credentials:
- client_id: CRD-NAME
client_secret: xxxx
name: CRD-NAME
redirect_uris:
- http://xyz
tags:
- CON-NAME-TAG
username: CON-NAME
tags:
- CON-NAME-TAG
RootConfig。爪哇
public class RootConfig {
private List<Consumer> consumers;
public List<Consumer> getConsumers() {
return consumers;
}
public void setConsumers(List<Consumer> consumers) {
this.consumers = consumers;
}
}
消费者。爪哇:
public class Consumer {
private List<Acl> acls;
private List<Oauth2Credential> oauth2Credentials;
private String username;
private List<String> tags;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<Acl> getAcls() {
return acls;
}
public void setAcls(List<Acl> acls) {
this.acls = acls;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
public List<Oauth2Credential> getOauth2Credentials() {
return oauth2Credentials;
}
public void setOauth2Credentials(List<Oauth2Credential> oauth2Credentials) {
this.oauth2Credentials = oauth2Credentials;
}
}
Oauth2Credential。爪哇:
public class Oauth2Credential {
private String clientId;
private String clientSecret;
private String name;
private List<String> redirectUris;
private List<String> tags;
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return clientSecret;
}
public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getRedirectUris() {
return redirectUris;
}
public void setRedirectUris(List<String> redirectUris) {
this.redirectUris = redirectUris;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
}
Acl。爪哇:
public class Acl {
private String group;
private List<String> tags;
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
}
配置加载器。爪哇:
public class ConfigLoader {
public RootConfig load(String file) {
Yaml yaml = new Yaml(new Constructor(RootConfig.class));
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream(file);
RootConfig rootConfig = yaml.load(inputStream);
System.out.println(rootConfig);
return rootConfig;
}
}
配置加载程序给了我以下错误:
Caused by: Cannot create property=oauth2_credentials for JavaBean=uk.gov.hmrc.deck.config.tool.modal.Consumer@1554909b
in 'reader', line 9, column 5:
- oauth2_credentials:
^
Unable to find property 'oauth2_credentials' on class: uk.gov.hmrc.deck.config.tool.modal.Consumer
in 'reader', line 10, column 7:
- client_id: CRD-MDTP-BREATHINGS ...
^
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:291)
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:172)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:230)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:220)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequenceStep2(BaseConstructor.java:391)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequence(BaseConstructor.java:375)
at org.yaml.snakeyaml.constructor.Constructor$ConstructSequence.construct(Constructor.java:543)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:230)
at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:220)
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.newInstance(Constructor.java:306)
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:268)
... 10 more
Caused by: org.yaml.snakeyaml.error.YAMLException: Unable to find property 'oauth2_credentials' on class: uk.gov.hmrc.deck.config.tool.modal.Consumer
at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:158)
at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:148)
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.getProperty(Constructor.java:310)
at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:231)
... 20 more
如果我删除oauth2\u凭据元素,它似乎工作正常。我认为名字中的下划线导致了这个问题。 知道怎么解决吗
# 1 楼答案
您需要使用
@YamlProperty(key = "oauth2_credentials")
如下所示:此外,解析时必须使用
AnnotationAwareConstructor
: