Невозможно использовать файл свойств базы данных в JavaLite

Не удалось загрузить файл свойств базы данных.

У меня есть файл database.properties в папке ресурсов пути к классу, и я настроил activejdbc.properties в корне classpathenv.connections.file=MyProject/src/main/resources/database.properties

Я использую mvn для запуска своего приложения:

mvn process-classes

mvn activejdbc-instrumentation:instrument

mvn package

mvn compile exec:java

Когда я запускаю приложение с Base.open(), я получаю сообщение об ошибке:

org.javalite.activejdbc.DBException: Could not find configuration in a property file for environment: development. Are you sure you have a database.properties file configured?
        at org.javalite.activejdbc.DB.open(DB.java:151)
        at org.javalite.activejdbc.Base.open(Base.java:52)
        at com.soul.seeker.Application.lambda$main$0(Application.java:52)
        at spark.FilterImpl$1.handle(FilterImpl.java:62)
        at spark.http.matching.BeforeFilters.execute(BeforeFilters.java:48)
        at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:129)
        at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
        at org.eclipse.jetty.server.Server.handle(Server.java:517)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
        at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)

обновление:

Запуск примера из javalite github работает нормально, однако, изменив его с помощью искровой маршрутизации, его выброс ошибка:

get("/role_on_login", (req, res) -> {
    Base.open();

    Person director = new Person("Stephen Spielberg");
    director.saveIt();

    director.add(new Movie("Saving private Ryan", 1998));
    director.add(new Movie("Jaws", 1982));
    List data = director.getAll(Movie.class);
    Base.close();

    return data;
});

Ошибка:

[qtp1213754379-16] WARN org.eclipse.jetty.server.HttpChannel - //localhost:4567/role_on_login
org.javalite.activejdbc.DBException: there is no connection 'default' on this thread, are you sure you opened it?
        at org.javalite.activejdbc.DB.connection(DB.java:754)
        at org.javalite.activejdbc.DB.createStreamingPreparedStatement(DB.java:521)
        at org.javalite.activejdbc.DB.find(DB.java:512)
        at org.javalite.activejdbc.LazyList.hydrate(LazyList.java:329)
        at org.javalite.activejdbc.AbstractLazyList.toString(AbstractLazyList.java:190)
        at spark.serialization.DefaultSerializer.process(DefaultSerializer.java:38)
        at spark.serialization.Serializer.processElement(Serializer.java:49)
        at spark.serialization.Serializer.processElement(Serializer.java:52)
        at spark.serialization.Serializer.processElement(Serializer.java:52)
        at spark.serialization.SerializerChain.process(SerializerChain.java:53)
        at spark.http.matching.Body.serializeTo(Body.java:72)
        at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:189)
        at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
        at org.eclipse.jetty.server.Server.handle(Server.java:517)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
        at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
        at java.lang.Thread.run(Unknown Source)

Так что похоже на проблему с потоком, когда javalite Base.open() создает поток с именем «по умолчанию», а искра не может понять поток с именем «по умолчанию».


person kittu    schedule 31.03.2017    source источник


Ответы (2)


Вам нужно понять, как работают жизненные циклы Maven.

  1. Не нужно звонить mvn activejdbc-instrumentation:instrument
  2. Не выполнять compile до exec.java

Просто сделайте это:

mvn package
mvn exec:java

Поскольку вы не предоставили никакой дополнительной информации о своем pom.xml, я предполагаю, что это типично для конфигурации ActiveJDBC Maven.

person ipolevoy    schedule 05.04.2017
comment
Лучше всего начать с этого примера проекта: github.com/javalite/simple-example. - person ipolevoy; 06.04.2017
comment
Использование mvn package mvn exec:java и запуск приложения по-прежнему дает ту же ошибку: org.javalite.activejdbc.DBException: Could not find configuration in a property file for environment: development. Are you sure you have a database.properties file configured? - person kittu; 06.04.2017
comment
Пробовал с: github.com/javalite/simple-example, что дает ту же ошибку: Caused by: org.javalite.activejdbc.DBException: Could not find configuration in a property file for environment: development. Are you sure you have a database.properties file configured? - person kittu; 06.04.2017
comment
Пример рабочего проекта поможет всем. Посетите github.com/javalite/simple-example и убедитесь, что у него такие же проблемы. - person kittu; 06.04.2017
comment
этот пример проекта работает должным образом: github.com/javalite/simple-example. Пожалуйста, следуйте инструкциям на странице README. - person ipolevoy; 06.04.2017
comment
Запуск java -classpath target/dependency:target/classes activejdbc.examples.simple.Main выбрасывает Error: Could not find or load main class activejdbc.examples.simple.Main, поэтому он НЕ РАБОТАЕТ, КАК ОЖИДАЕТСЯ - person kittu; 06.04.2017
comment
@kittu, я только что проверил, все работает как положено. Пожалуйста, следуйте инструкциям файла README. - person ipolevoy; 06.04.2017
comment
Мне жаль говорить, что я так много раз пытался с построчными инструкциями в файле readme, но я получаю сообщение об ошибке: could not find main class. Я не знаю, почему это не работает для меня. Я использую командную строку для запуска команд :( - person kittu; 06.04.2017
comment
Я пытаюсь записать свой экран во время выполнения команд и отправить вам ссылку, чтобы вы могли видеть - person kittu; 06.04.2017
comment
@kittu, вот результат пошагового запуска этого примера: . Это просто работает, пожалуйста, посмотрите, не пропустили ли вы шаг. - person ipolevoy; 06.04.2017
comment
Он работает в вашей системе, но не работает в других. Я попробовал это в новой системе, которую купил на днях. Та же ошибка, что и main method is not found. Может быть, чего-то не хватает в документации. Вот ссылка на YouTube со всеми шагами, которую я записал: youtube.com/watch ?v=MmDkbadeDWw&feature=youtu.be - person kittu; 13.04.2017
comment
@kittu, ошибки Error: Could not find or load main class activejdbc.examples.simple.Main и Caused by: org.javalite.activejdbc.DBException: Could not find configuration in a property file for environment разные. Наверняка что-то не так в том, как вы выполняете. К сожалению видео не работает. Можешь исправить видео? - person ipolevoy; 13.04.2017
comment
Вы видели видео? Жду твоего ответа? - person kittu; 13.04.2017
comment
Так что ты думаешь? Я выполнил все шаги правильно в видео. В чем может быть проблема? - person kittu; 14.04.2017
comment
@kittu, у тебя проблема в том, что ты используешь формат пути Linux в Windows. Инструкции предназначены для пути к классам с использованием формата Linux: target/dependency:target/classes. Обратите внимание на двоеточие :. В Windows разделителем пути является точка с запятой: java -classpath target/dependency;target/classes activejdbc.examples.simple.Main. - person ipolevoy; 14.04.2017
comment
Ты прав. Наконец это сработало, но основная проблема заключается в том, что Base.open() создает поток с именем Default, и javaspark не может его понять, если я не ошибаюсь. Обновил вопрос. Есть идеи, как это исправить? - person kittu; 14.04.2017

Это второй ответ на вторую часть вашего вопроса, который вы добавили последним.

Причина, по которой у вас нет подключения, заключается в том, что ActiveJDBC по умолчанию ленив: http://javalite.io/lazy_and_eager. Это означает, что во время выполнения метода Spark get() вы открываете и закрываете соединение с базой данных. Объект data, который вы передаете в представление, не имел возможности загрузить данные из базы данных. Есть три способа решить эту проблему:

  1. Вызвать прямое обращение к базе данных:

    База.открыть();

    Person director = new Person("Stephen Spielberg");
    director.saveIt();
    
    director.add(new Movie("Saving private Ryan", 1998));
    director.add(new Movie("Jaws", 1982));
    List data = director.getAll(Movie.class);
    data.size(); // <<<-- force trip to database before closing connection
    Base.close();
    return data;
    
  2. Используйте фильтры Spark для открытия и закрытия соединений с БД и не загрязняйте код в ваших get() методах: http://sparkjava.com/documentation.html#filters

  3. Используйте ActiveWeb, хорошо интегрированный с ActiveJDBC: http://javalite.io/activeweb

person ipolevoy    schedule 14.04.2017
comment
хорошо, я просмотрел документы In order to pre-populate the list before passing it off, you need to call any method that will force loading (hydrating) of the list from the database i.e. list.size() и использовал фильтры spark before() и after(), но все равно выдает ту же ошибку: Could not find configuration in a property file for environment: development. Are you sure you have a database.properties file configured? - person kittu; 15.04.2017
comment
@kittu, если это происходит, вам нужно выяснить, почему файла нет. Посмотрите, как вы упаковываете и развертываете свой файл WAR. Файл database.properties должен находиться в пути к классам вашего проекта при работе в веб-контейнере. Это должно быть просто! - person ipolevoy; 16.04.2017