Исключение «Поставщик не является подтипом» при использовании hibernate-ogm-neo4j в glassfish4

#neo4j #glassfish-4 #hibernate-ogm #serviceloader #neo4j-bolt

#neo4j #glassfish-4 #hibernate-ogm #serviceloader #neo4j-bolt

Вопрос:

Я пытаюсь запустить hibernate-ogm-neo4j (5.1.0.Alpha1) в моем glassfish (4.1.1). При запуске сервера приложений с datastorprovider <property name="hibernate.ogm.datastore.provider" value="neo4j_embedded"/> он показывает длинный stacktrace, постоянно повторяющий следующие исключения:

 java.util.ServiceConfigurationError: org.neo4j.kernel.extension.KernelExtensionFactory: Provider org.neo4j.jmx.impl.JmxExtensionFactory not a subtype
java.util.ServiceConfigurationError: org.neo4j.kernel.extension.KernelExtensionFactory: Provider org.neo4j.index.lucene.LuceneKernelExtensionFactory not a subtype
java.util.ServiceConfigurationError: org.neo4j.kernel.extension.KernelExtensionFactory: Provider org.neo4j.kernel.api.impl.labelscan.LuceneLabelScanStoreExtension not a subtype
java.util.ServiceConfigurationError: org.neo4j.kernel.extension.KernelExtensionFactory: Provider org.neo4j.kernel.api.impl.schema.LuceneSchemaIndexProviderFactory not a subtype
java.util.ServiceConfigurationError: org.neo4j.kernel.extension.KernelExtensionFactory: Provider org.neo4j.ext.udc.impl.UdcKernelExtensionFactory not a subtype
  

При использовании <property name="hibernate.ogm.datastore.provider" value="neo4j_bolt"/> исключения изменяются на

 java.util.ServiceConfigurationError: org.neo4j.driver.internal.spi.Connector: Provider org.neo4j.driver.internal.connector.socket.SocketConnector not a subtype
  

Я бы предпочел подключиться в режиме Bolt, но я не уверен, что я что-то неправильно настроил или это ошибка в hibernate-ogm или neo4j.

Это мой полный persistence.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

  <persistence-unit name="ogm-neo4j" transaction-type="JTA">
      <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
      <properties>
        <property name="hibernate.ogm.datastore.provider" value="neo4j_bolt"/>
        <property name="hibernate.ogm.neo4j.database_path" value="C:tempvtc.neo4j" />
      </properties>
  </persistence-unit>
</persistence>
  

Обновить

Я немного углубился в сообщение об ошибке. На самом деле оно выдается в ServiceLoader классе Java и говорит что-то вроде org.neo4j.driver.internal.spi.Connector , что это не суперкласс org.neo4j.driver.internal.connector.socket.SocketConnector . Но, конечно, это

 public class SocketConnector implements Connector
  

И есть также META-INF.services описание в связанном neo4j-java-driver-1.0.4.jar , которое содержит путь к ожидаемому абсолютному имени класса org.neo4j.driver.internal.connector.socket.SocketConnector .

Это приводит меня в еще большее замешательство. Должен ли я применять эту конфигурацию к моему Glassfish, потому что это не выполняется автоматически?

Обновление 2

Проблема исчезает, если используется neo4j-java-driver-1.1.0-M6.jar (просто объявите зависимость в вашем pom, и она будет использоваться вместо 1.0.4. который поставляется в комплекте с hibernate-ogm-neo4j-5.1.0.Alpha1). Все еще не понимаю, что не так с версией 1.0.x, но я связался с разработчиками, чтобы выяснить это.

Комментарии:

1. Как вы думаете, вы можете создать тестовый проект или пример для решения этой проблемы?

2. Я создал пример проекта на github: github.com/Restage/HibernateOgmExample Просто запустите экземпляр neo4j с заданными настройками подключения из persistence.xml а затем разверните ear на glassfish и, надеюсь, вы увидите проблему. Для меня изменение neo4j-java-driver на версию 1.1.0-M6 решило проблему. Я также создал проблему на странице их проекта ( github.com/neo4j/neo4j-java-driver/issues/261 ) но пока не получил никаких комментариев. Если у вас возникнут какие-либо проблемы с воспроизведением ошибки, просто дайте мне знать.