在Java中读取YAML文件时堆栈溢出

时间:2018-10-26 07:58:21

标签: java jackson

我得到

  

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造com.ykb.frd.fraudcore.configuration.DatabaseConfiguration的实例,问题:空

读取YAML文件时出现

异常。然后应用程序会反复尝试,直到由于Stack Overflow异常而崩溃

YAML文件:

db:
  url: blablablaurl
  user: blabla
  password: blabla

Java:

@JsonIgnoreProperties(ignoreUnknown = true)
public class DatabaseConfiguration {
    private Database db;
    private static DatabaseConfiguration single_instance = null;

    private DatabaseConfiguration() {
        db = readYml();
    }

    public static DatabaseConfiguration getInstance() {
        if (single_instance == null)
            single_instance = new DatabaseConfiguration();

        return single_instance;
    }

    private final String YML_PATH = //path;

    public Database getDb() {
        return db;
    }

    /**
     * Read from application.yml
     * @return Database object
     */
    private Database readYml(){
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        try {
            return mapper.readValue(new File(YML_PATH), DatabaseConfiguration.class).getDb();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

readYml()函数内部,无限循环发生在mapper.readValue的顶部。我猜想它与单例对象有关,但我不确定。

调用数据库配置:

private DatabaseConfiguration database = DatabaseConfiguration.getInstance();

谢谢。

1 个答案:

答案 0 :(得分:2)

该类不能是单例。杰克逊需要一个公共的默认构造函数。您应该使用其他类(实际上是DTO)对YAML进行反序列化,然后将该对象传递给您的单例。

顺便说一下,singleton is an antipattern