Переполнение стека при чтении файла YAML в Java - PullRequest
0 голосов
/ 26 октября 2018

Я получаю

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: невозможно создать экземпляр com.ykb.frd.fraudcore.configuration.DatabaseConfiguration, проблема: нуль

исключение при чтении файла YAML. И приложение пытается снова и снова, пока не произойдет сбой из-за исключения переполнения стека

Файл 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 голосов
/ 26 октября 2018

Класс не может быть одноэлементным.Джексону нужен общедоступный конструктор по умолчанию.Вам следует использовать другой класс - фактически DTO - для десериализации YAML, а затем передать этот объект вашему синглтону.

Кстати, синглтон является антипаттерном .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...