java 如何使用Jackson将属性对象转换为自定义对象?

33qvvth1  于 2023-02-15  发布在  Java
关注(0)|答案(2)|浏览(172)

在Sping Boot 应用程序中,Spring Boot用于从YAML文件构建Properties对象,如下所示:

YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
yamlFactory.setResources(new DefaultResourceLoader().getResource("application.yml"));
Properties properties = yamlFactory.getObject();

使用Sping Boot 自己的解析器的原因是,它不仅读取符合YAML的设置,还读取点标记的属性,例如:

artist.elvis.name: "Elvis"
artist.elvis.message: "Aloha from Hawaii"

现在已经构建了Properties对象,我想将其Map到如下所示的对象:

@JsonIgnoreProperties(ignoreUnknown = true)
private record Artist(Elvis elvis) {

    private record Elvis(String name, String message) { }
}

我的问题是

Jackson怎么能做到这一点呢?或者有没有另一种/更好的解决办法?
非常感谢你的帮助

ggazkfy8

ggazkfy81#

我在Ratpack框架中看到过类似的功能。例如:

var propsFileUrl =
                Thread.currentThread()
                        .getContextClassLoader()
                        .getResource("application.properties");

        ApplicationProperties applicationProperties =
                ConfigData.builder()
                        .props(propsFileUrl)
                        .build()
                        .get(ApplicationProperties.class);

实际上,它是使用Jackson的对象Map器完成的,但是在这里发布它的逻辑并不简单。
这里是图书馆:
https://mvnrepository.com/artifact/io.ratpack/ratpack-core/2.0.0-rc-1

xdnvmnnf

xdnvmnnf2#

application.yml是默认的yml文件,因此不需要自定义配置。Value annotation应该能够读取属性。

@Value("${artist.elvis.name}")
private String name;

下一部分我不确定你的要求,但希望这是你正在寻找的。
要绑定到这个对象,“constructor”可能是个不错的选择。

@Bean
public class Elvis {
  private String name;
  private String message;

  public Elvis(@Value("${artist.elvis.name"}) final String name, @Value("${artist.elvis.message"}) final String message) {
     this.name=name;
     this.message=message
  }

  // getter setter for name and message
}

现在将创建的bean自动连接到Artist bean

@Bean("artists")
public class Artists {
  @Autowired
  private Elvis elvis
  
  pubic Elvis getElvis() {
    return elvis;
  }
}

相关问题