Hibernate Search 从 Wildfly 9 开始,但不是 Wildfly 10

Hibernate Search starts with Wildfly 9 but not Wildfly 10

这是一个带有 Hibernate Search 的 Maven 项目。 Servlet 在 Wildfly 9.

上完美运行

我一在 Wildfly 10 上启动它,当 Spring 自动装配 bean 时我就崩溃了:

ERROR [ContextLoader]:351 - Context initialization failed
nested exception is java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.search.hcore.impl.HibernateSearchIntegrator not a subtype
[...]
Caused by: java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.search.hcore.impl.HibernateSearchIntegrator not a subtype
    at java.util.ServiceLoader.fail(ServiceLoader.java:239)
    at java.util.ServiceLoader.access0(ServiceLoader.java:185)
    at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
    at java.util.ServiceLoader.next(ServiceLoader.java:480)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.loadJavaServices(ClassLoaderServiceImpl.java:341)
    at org.hibernate.integrator.internal.IntegratorServiceImpl.<init>(IntegratorServiceImpl.java:57)
    at org.hibernate.boot.registry.BootstrapServiceRegistryBuilder.build(BootstrapServiceRegistryBuilder.java:247)
    at org.hibernate.boot.registry.StandardServiceRegistryBuilder.<init>(StandardServiceRegistryBuilder.java:73)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1915)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)

我尝试了不同版本的已声明库,但没有成功。

    <spring.version>4.2.6.RELEASE</spring.version>
    <spring.boot.version>1.3.5.RELEASE</spring.boot.version>
    <lucene.version>4.10.4</lucene.version> 
    <hibernate-search-orm.version>5.3.0.Final</hibernate-search-orm.version>
    <solr-core.version>4.10.4</solr-core.version>

有人知道发生了什么事吗?

Hibernate ORMHibernate Search 都包含在 WildFly 自第 8 版以来。

与 WildFly 9 相比,WildFly 10 的一个显着区别是,如果检测到 Hibernate Search 的使用,它会自动添加到您的类路径中。这将使您的 WAR 文件更小并使用最新的稳定版本,所以这是我推荐的方法(虽然我不是 Spring 用户 - 很想知道它是否使 [= =41=] 用户,请在 Hibernate 论坛上告诉我。)

如果满足以下条件,则会触发检测规则:

  1. 您正在使用 Hibernate 作为持久性提供程序实现
  2. 您的任何实体都带有 @Indexed
  3. 注释

所以我怀疑您最好的解决方案是确保您在部署中既不包括 Hibernate ORM 也不包括 Hibernate Search 以避免冲突。

如果您更喜欢使用您自己的框架版本,您可以设置以下 属性 以不注入这些依赖项(以便使用您在应用程序中捆绑的库),或者您可以还可以选择将这些自定义版本打包到 WildFly 模块中并使用替代版本(您可以使用具有不同 "slot" 标识符的替代版本)。

wildfly.jpa.hibernate.search.module = none

这个属性需要在你的persistence.xml中定义。

另请参阅 WildFly 10 JPA Reference Guide 以获得此属性和类似属性的完整描述。