HibernateSearch ElasticSearch集成错误:线程中出现异常;“主要”;java.lang.ExceptionInInitializeError
我正在尝试为ElasticSearch集成配置HibernateSearch。我从HibernateSearch获取以下错误: 我正在使用Oracle数据库,并在pom.xml文件中添加了所需的依赖项 请查找我的错误,我得到:HibernateSearch ElasticSearch集成错误:线程中出现异常;“主要”;java.lang.ExceptionInInitializeError,java,hibernate,
elasticsearch,hibernate-search,Java,Hibernate,
elasticsearch,Hibernate Search,我正在尝试为ElasticSearch集成配置HibernateSearch。我从HibernateSearch获取以下错误: 我正在使用Oracle数据库,并在pom.xml文件中添加了所需的依赖项 请查找我的错误,我得到: Exception in thread "main" java.lang.ExceptionInInitializerError at com.test.webservice.elasticsearch.App.displayContactTableData(App.ja
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.test.webservice.elasticsearch.App.displayContactTableData(App.java:50)
at com.test.webservice.elasticsearch.App.main(App.java:70)
Caused by: java.lang.NullPointerException
at org.hibernate.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl.<init>(MetadataBuilderImpl.java:579)
at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:127)
at org.hibernate.boot.MetadataSources.getMetadataBuilder(MetadataSources.java:135)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:654)
at com.test.webservice.elasticsearch.HibernateUtil.configureSessionFactory(HibernateUtil.java:36)
at com.test.webservice.elasticsearch.HibernateUtil.<clinit>(HibernateUtil.java:44)
... 2 more
我使用所有最新的依赖项
hibernate-search-orm ->5.9.1.Final
hibernate-core ->5.2.16.Final
ojdbc14 -> 10.2.0.4.0
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
<property name="hibernate.connection.username">testdb</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.search.default.directory_provider">filesystem</property>
<property name="hibernate.search.default.indexBase">C:\lucene\product\indexes</property>
<mapping class="com.test.webservice.model.Product" />
</session-factory>
</hibernate-configuration>
App.java
public class App
{
private static void doIndex() throws InterruptedException {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
fullTextSession.close();
}
private static List<Product> search(String queryString) {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("name").matching(queryString).createQuery();
// wrap Lucene query in a javax.persistence.Query
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);
List<Product> productList = fullTextQuery.list();
fullTextSession.close();
return productList;
}
private static void displayContactTableData() {
Session session = null;
try {
session = HibernateUtil.getSession();
// Fetching saved data
List<Product> productList = session.createQuery("from Product").list();
for (Product product : productList) {
System.out.println(product);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally{
if(session != null) {
session.close();
}
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("\n\n******Data stored in Contact table******\n");
displayContactTableData();
// Create an initial Lucene index for the data already present in the database
doIndex();
Scanner scanner = new Scanner(System.in);
String consoleInput = null;
while (true) {
// Prompt the user to enter query string
System.out.println("\n\nEnter search key (To exit type 'X')");
System.out.println();
consoleInput = scanner.nextLine();
if("X".equalsIgnoreCase(consoleInput)) {
System.out.println("End");
System.exit(0);
}
List<Product> result = search(consoleInput);
System.out.println("\n\n>>>>>>Record found for '" + consoleInput + "'");
for (Product product : result) {
System.out.println(product);
}
}
}
}
公共类应用程序
{
私有静态void doIndex()引发InterruptedException{
Session Session=HibernateUtil.getSession();
FullTextSession FullTextSession=Search.getFullTextSession(会话);
fullTextSession.createIndexer().startAndWait();
fullTextSession.close();
}
私有静态列表搜索(字符串查询字符串){
Session Session=HibernateUtil.getSession();
FullTextSession FullTextSession=Search.getFullTextSession(会话);
QueryBuilder QueryBuilder=fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class.get();
org.apache.lucene.search.Query luceneQuery=queryBuilder.keyword().onFields(“name”).matching(queryString.createQuery();
//在javax.persistence.query中包装Lucene查询
org.hibernate.Query fullTextQuery=fullTextSession.createFullTextQuery(luceneQuery,Product.class);
List productList=fullTextQuery.List();
fullTextSession.close();
返回产品列表;
}
私有静态void displayContactTableData(){
会话=空;
试一试{
session=HibernateUtil.getSession();
//获取保存的数据
List productList=session.createQuery(“来自产品”).List();
对于(产品:productList){
系统输出打印项次(产品);
}
}捕获(例外情况除外){
例如printStackTrace();
}最后{
if(会话!=null){
session.close();
}
}
}
公共静态void main(字符串[]args)引发InterruptedException{
System.out.println(“\n\n*******存储在联系人表中的数据******\n”);
displayContactTableData();
//为数据库中已有的数据创建初始Lucene索引
doIndex();
扫描仪=新的扫描仪(System.in);
字符串consoleInput=null;
while(true){
//提示用户输入查询字符串
System.out.println(“\n\n输入搜索键(以退出类型“X”)”;
System.out.println();
consoleInput=scanner.nextLine();
如果(“X”。相等信号情况(控制台输入)){
系统输出打印项次(“结束”);
系统出口(0);
}
列表结果=搜索(控制台输入);
System.out.println(“\n\n>>>>为“+”控制台输入+”)找到的记录;
对于(产品:结果){
系统输出打印项次(产品);
}
}
}
}
您的代码声明了两个ServiceRegistry
变量:sr
和ServiceRegistry
serviceRegistry
将其传递到configuration.buildSessionFactory
时包含null
,因为您将该值放入了sr
选择一个变量,正确使用它,删除另一个变量,您应该会没事。您需要进一步查看异常的堆栈跟踪。
异常InInitializeRerror
是由另一个错误引起的:为了能够帮助您,我们需要知道原因。@Sanne-添加了完整错误。
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateUtil {
private static SessionFactory sessionFactory = null;
private static ServiceRegistry serviceRegistry = null;
private static SessionFactory configureSessionFactory() throws HibernateException {
Configuration configuration = new Configuration();
configuration.configure();
Properties properties = configuration.getProperties();
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(properties).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
static {
configureSessionFactory();
}
private HibernateUtil() {}
public static Session getSession() {
return sessionFactory.openSession();
}
}
public class App
{
private static void doIndex() throws InterruptedException {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
fullTextSession.close();
}
private static List<Product> search(String queryString) {
Session session = HibernateUtil.getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("name").matching(queryString).createQuery();
// wrap Lucene query in a javax.persistence.Query
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);
List<Product> productList = fullTextQuery.list();
fullTextSession.close();
return productList;
}
private static void displayContactTableData() {
Session session = null;
try {
session = HibernateUtil.getSession();
// Fetching saved data
List<Product> productList = session.createQuery("from Product").list();
for (Product product : productList) {
System.out.println(product);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally{
if(session != null) {
session.close();
}
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("\n\n******Data stored in Contact table******\n");
displayContactTableData();
// Create an initial Lucene index for the data already present in the database
doIndex();
Scanner scanner = new Scanner(System.in);
String consoleInput = null;
while (true) {
// Prompt the user to enter query string
System.out.println("\n\nEnter search key (To exit type 'X')");
System.out.println();
consoleInput = scanner.nextLine();
if("X".equalsIgnoreCase(consoleInput)) {
System.out.println("End");
System.exit(0);
}
List<Product> result = search(consoleInput);
System.out.println("\n\n>>>>>>Record found for '" + consoleInput + "'");
for (Product product : result) {
System.out.println(product);
}
}
}
}