WedX - журнал о программировании и компьютерных науках

NullPointer в журнале при первом подключении к базе данных

Я получаю NullPointerException на консоли моего кота при первом подключении к базе данных с помощью createEntityManager(). Я использую:

  • апач томкэт 8.0.24
  • eclipselink 2.6.1-RC1 (косвенно используется JPA)
  • sqlite jdbc 3.8.10.1

Сообщение журнала следующее:

[EL Warning]: connection: 2015-08-21 16:01:51.569--java.lang.NullPointerException
[EL Info]: 2015-08-21 16:01:51.585--ServerSession(29156874)--EclipseLink, version: Eclipse Persistence Services - 2.6.1.v20150605-31e8258
[EL Info]: connection: 2015-08-21 16:01:52.365--Not able to detect platform for vendor name [SQLite33.8.10.1]. Defaulting to [org.eclipse.persistence.platform.database.DatabasePlatform]. The database dialect used may not match with the database you are using. Please explicitly provide a platform using property "eclipselink.target-database".
[EL Info]: connection: 2015-08-21 16:01:52.505--ServerSession(29156874)--/file:/C:/eclipse_ee/workspaces/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jeejpa/WEB-INF/classes/_training-jpa login successful

Мое приложение, похоже, работает нормально. Должен ли я обращать внимание на предупреждение об NullPointerException? Или мне нужно заботиться об информации?

Not able to detect platform for vendor name [SQLite33.8.10.1].
Defaulting to [org.eclipse.persistence.platform.database.DatabasePlatform].
The database dialect used may not match with the database you are using.
Please explicitly provide a platform using property "eclipselink.target-database".

EDIT: Благодаря помощи @baumato и настройке <property name="eclipselink.target-database" value="Database" />информация о Невозможно обнаружить... больше не отображается. Подробное исключение NullPointerException теперь выглядит так:

[EL Finest]: jpa: 2015-08-21 16:44:52.954--ServerSession(12993102)--Thread(Thread[http-nio-8443-exec-6,5,main])--Begin deploying Persistence Unit training-jpa; session /file:/C:/eclipse_ee/workspaces/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jeejpa/WEB-INF/classes/_training-jpa; state Predeployed; factoryCount 1
[EL Finest]: jpa: 2015-08-21 16:44:52.964--ServerSession(12993102)--Thread(Thread[http-nio-8443-exec-6,5,main])--Bean Validation Factory was not initialized: [javax/validation/Validation].
[EL Warning]: connection: 2015-08-21 16:44:52.974--Thread(Thread[http-nio-8443-exec-6,5,main])--java.lang.NullPointerException
    at org.eclipse.persistence.platform.server.ServerPlatformUtils.createServerPlatform(ServerPlatformUtils.java:99)
    at org.eclipse.persistence.sessions.factories.SessionManager.init(SessionManager.java:77)
    at org.eclipse.persistence.sessions.factories.SessionManager.<clinit>(SessionManager.java:71)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.addSessionToGlobalSessionManager(EntityManagerSetupImpl.java:907)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.initSession(EntityManagerSetupImpl.java:2671)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:675)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:305)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:337)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:303)
    at de.training.beans.LoginBean.login(LoginBean.java:58)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:654)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at de.training.filter.URILoggerFilter.doFilter(URILoggerFilter.java:24)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at de.training.filter.LoginFilter.doFilter(LoginFilter.java:38)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

[EL Finer]: 2015-08-21 16:44:52.974--Thread(Thread[http-nio-8443-exec-6,5,main])--initializing session manager

  • Вы сталкиваетесь с той же проблемой на платформе целевого сервера eclipse.org. /eclipselink/documentation/2.4/jpa/extensions/ 24.08.2015
  • Что ты имеешь в виду? Платформа целевого сервера будет по умолчанию (TargetServer.None), так как я использую Tomcat. 24.08.2015
  • Попробуйте установить его. «Исключение» возникает, когда он не может найти целевой класс сервера, который он перехватывает, регистрирует и игнорирует. 25.08.2015

Ответы:


1

Это исключение относится не к платформе базы данных, а к платформе сервера приложений. Это не смертельно. Метод SessionManager#init() делает следующее:

    String platformClass
            = ServerPlatformUtils.detectServerPlatform(null);
    try {
        detectedPlatform
                = ServerPlatformUtils.createServerPlatform(
                null, platformClass,
                SessionManager.class.getClassLoader());
    } catch (NullPointerException npe) {
        //some platforms may not be handling 'null' session well,
        //so be defensive here and only log throwable here
        detectedPlatform = null;
        LOG.logThrowable(SessionLog.WARNING,
                AbstractSessionLog.CONNECTION, npe);
    }

Таким образом, в качестве обнаруженной серверной платформы используется null, и EclipseLink будет считать, что текущая платформа сервера приложений не поддерживает многопользовательскую среду (которой нет в Apache Tomcat). Этот код в SessionManager связан с новой функцией WebLogic, и вы можете просто игнорировать его. 2.7.0 вызывает ServerPlatformException вместо NPE, но это изменение не было перенесено в 2.6.1.

Если вы хотите добавить определение платформы Apache Tomcat, откройте запрос на улучшение на Eclipselink Bugzilla и проголосовать за него, чтобы дать ему приоритет.

17.09.2015
  • Это действительно плохой код в EclipseLink 2.6.1. NPE, нет сообщения. EclipseLink вызывает этот метод из трех мест потенциально с нулевым значением и не дает никаких намеков на то, что не так. public static ServerPlatform createServerPlatform (сессия DatabaseSession, String platformClass, загрузчик ClassLoader) { if (platformClass == null) { throw new NullPointerException(); } 05.11.2015
  • Та же проблема в Glassfish и Payara. Проблема в том, что NPE вызывается перед синтаксическим анализом persistence.xml, поэтому здесь нет способа решить эту проблему. Я сообщу об этом в bugzilla. 05.11.2015
  • Хорошо спасибо. Пожалуйста, пришлите мне номер ошибки на [email protected], я проверю, что мы можем с ней сделать. 06.11.2015
  • Я прокомментировал эту проблему и прикрепил ссылку на трассировку стека в Pastebin bugs.eclipse .org/bugs/show_bug.cgi?id=463629#c10 10.11.2015
  • Похоже, это будет исправлено в 2.6.2, хотя это очень раздражает, особенно потому, что это происходит до разбора конфигурации. Очень плохо видеть такие статические инициализаторы :-( 03.12.2015
  • Между прочим, я внес свой вклад в реализацию платформы Tomcat 8 по адресу: bugs.eclipse. org/bugs/show_bug.cgi?id=457558, но это не привлекло особого внимания. 03.12.2015

  • 2

    Я бы предложил добавить следующие свойства в раздел свойств вашего файла persistence.xml, чтобы получить подробную информацию об отладке:

    <property name="eclipselink.logging.level" value="ALL" />
    <property name="eclipselink.logging.level.sql" value="FINE"/>
    <property name="eclipselink.logging.parameters" value="true" />
    <property name="eclipselink.logging.connection" value="true" />
    <property name="eclipselink.logging.session" value="true" />
    <property name="eclipselink.logging.thread" value="true" />
    <property name="eclipselink.logging.timestamp" value="true" />
    

    И, как говорится в информационном сообщении, попробуйте установить свойство:

    <property name="eclipselink.target-database" value="Auto" />
    

    Поскольку «Авто» используется по умолчанию, это может не помочь. Поэтому установите целевую базу данных в «База данных». При этом используется общая база данных, если ваша целевая база данных не указана в списке и ваш драйвер JDBC не поддерживает метаданные, необходимые для Auto. Дополнительную информацию см. по адресу: https://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_target_database.htm#sthash.y1lrDjUn.dpuf)

    <property name="eclipselink.target-database" value="Database" />
    
    21.08.2015
  • Большое спасибо. Свойство target-database, установленное на Database, как вы предложили и которое я уже обновил в своем исходном сообщении, удалило информационное сообщение о платформе. Я добавил подробный NullPointerException - было бы здорово, если бы вы могли помочь еще раз. 21.08.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]