40

I am trying to add Elasticsearch to my project. I have addded the necessary dependencies to my pom.xml file. When I run the server I am getting this error:

java.lang.IllegalStateException: Failed to introspect Class
[net.kzn.shoppingbackend.config.HibernateConfig] from ClassLoader
[ParallelWebappClassLoader

Please help me solve this problem.

Also I tried to find elasticsearch.yml file in eclipse to configure node but there is no such file. where Can i find elasticsearch.yml file.

HibernateConfig.java

package net.kzn.shoppingbackend.config;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableElasticsearchRepositories(basePackages = "net.kzn.shoppingbackend")
@ComponentScan(basePackages = { "net.kzn.shoppingbackend" })
@EnableTransactionManagement
public class HibernateConfig {

    // change the below based on the DBMS you choose
    private final static String DATABASE_URL = "jdbc:h2:tcp://localhost/~/onlineshopping";
    private final static String DATABASE_DRIVER = "org.h2.Driver";
    private final static String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect";
    private final static String DATABASE_USERNAME = "sa";
    private final static String DATABASE_PASSWORD = "";

    @Value("${elasticsearch.home:/home/vidyesh/.m2/repository/org/elasticsearch/client/elasticsearch-rest-client/5.6.8}")
    private String elasticsearchHome;

    @Value("${elasticsearch.cluster.name:elasticsearch}")
    private String clusterName;

    // database bean will be available
    @Bean("dataSource")
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();

        // providing the database connection information

        dataSource.setDriverClassName(DATABASE_DRIVER);
        dataSource.setUrl(DATABASE_URL);
        dataSource.setUsername(DATABASE_USERNAME);
        dataSource.setPassword(DATABASE_PASSWORD);

        return dataSource;
    }

    // sessionFactory bean will be available
    @Bean
    public SessionFactory getSessionFactory(DataSource dataSource) {

        LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource);

        builder.addProperties(getHibernateProperties());
        builder.scanPackages("net.kzn.shoppingbackend");

        return builder.buildSessionFactory();
    }

    // All the hibernate properties will be returned in this method
    private Properties getHibernateProperties() {

        Properties properties = new Properties();

        properties.put("hibernate.dialect", DATABASE_DIALECT);
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.format_sql", "true");

        properties.put("hibernate.hbm2ddl.auto", "update");

        return properties;
    }

    @Bean
    public Client client() {
        TransportClient client = null;
        try {
            final Settings elasticsearchSettings = Settings.builder()
              .put("client.transport.sniff", true)
              .put("path.home", elasticsearchHome)
              .put("cluster.name", clusterName).build();
            client = new PreBuiltTransportClient(elasticsearchSettings); 
            client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return client;
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchTemplate(client());
    }

    // transactionManager bean
    @Bean
    public HibernateTransactionManager geTransactionManager(SessionFactory sessionFactory) {

        HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
        return transactionManager;
    }

}

Loaders.java

package net.kzn.shoppingbackend.load;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import net.kzn.shoppingbackend.dto.Product;
import net.kzn.shoppingbackend.dto.Users;
import net.kzn.shoppingbackend.repository.UsersRepository;

@Component
public class Loaders {

    @Autowired
    ElasticsearchOperations operations;

    @Autowired
    UsersRepository usersRepository;

    @PostConstruct
    @Transactional
    public void loadAll(){

        operations.putMapping(Product.class);
        System.out.println("Loading Data");
        usersRepository.save(getData());
        System.out.printf("Loading Completed");

    }

    private List<Users> getData() {
        List<Users> userses = new ArrayList<>();
        userses.add(new Users("Ajay",123L, "Accounting", 12000L));
        userses.add(new Users("Jaga",1234L, "Finance", 22000L));
        userses.add(new Users("Thiru",1235L, "Accounting", 12000L));
        return userses;
    }
}

This is my pom.xml file

POM.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>net.kzn</groupId>
<artifactId>shoppingbackend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>shoppingbackend</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>5.1.1.RELEASE</spring.version>
    <hibernate.version>5.3.6.Final</hibernate.version>
    <jackson.version>2.9.6</jackson.version>
</properties>

<dependencies>
    <!-- JUNIT version 4.12 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- spring -->

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- H2 database -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
    </dependency>

    <!-- Hibernate Dependency -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search-elasticsearch</artifactId>
        <version>5.10.4.Final</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.1</version>
    </dependency>


    <!-- database connection pooling -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.4.0</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.6</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.6</version>
    </dependency>

    <!-- SLF4J logging -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.25</version>
    </dependency>

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.12.Final</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>6.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>6.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.elasticsearch.plugin/transport-netty4-client -->
    <dependency>
        <groupId>org.elasticsearch.plugin</groupId>
        <artifactId>transport-netty4-client</artifactId>
        <version>6.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
        <version>3.0.11.RELEASE</version>
    </dependency>


    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>4.2.2</version>
    </dependency>



</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Error

    ERROR Context
initialization failed 19:56:48.391" o.s.web.context.ContextLoader java.lang.IllegalStateException:
Failed to introspect Class[net.kzn.shoppingbackend.config.HibernateConfig]from ClassLoader[ParallelWebappClassLoader
context:
    onlineshopping
    delegate:false---------->
Parent Classloader:java.net.URLClassLoader @24d 46 ca6]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:680)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:577)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:562)
at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:620)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:721)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:662)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:630)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1491)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:507)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:477)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:99)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:691)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:528)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:400)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)

Please tell me what am i doing wrong here? Problem is related to dependancies?

0

3 Answers 3

39

Caused by: java.lang.ClassNotFoundException: org.springframework.data.elasticsearch.core.ElasticsearchOperations

This error message means that the jar containing this class is not on the application classpath.

Add spring-data-elasticsearch jar to it, and your error should be gone.

if you are using maven, add the jar to the classpath this way :

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.2.5.RELEASE</version>
</dependency>

The version that you should use depends on the version of elastic search you are connecting to :

+--------------+----------------------------+----------------+-------------+
| Spring Data  | Spring Data Elasticsearch  | Elasticsearch  | Spring Boot |
+--------------+----------------------------+----------------+-------------+
| 2021.1       | 4.3.x                      |         7.15.2 | 2.5.x       |
| 2021.0       | 4.2.x                      |         7.12.0 | 2.5.x       |
| 2020.0.0     | 4.1.x                      |          7.9.3 | 2.3.x       |
| Neumann      | 4.0.x                      |          7.6.2 | 2.3.x       |
| Moore        | 3.2.x                      |          6.8.4 | 2.2.x       |
| Lovelace     | 3.1.x                      |          6.2.2 | 2.1.x       |
| Kay          | 3.0.x                      |          5.5.0 | 2.0.x       |
| Ingalls      | 2.1.x                      |          2.4.0 | 1.5.x       |
+--------------+----------------------------+----------------+-------------+

(source : https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#preface.versions )

Sign up to request clarification or add additional context in comments.

6 Comments

I added spring-data-elasticsearch jar file to class path Failed to introspect Class error is gone but new error is showing
None of the configured nodes are available: [{#transport#-1}{IQoE1_yHTfGWK_L2n5EHoQ}{127.0.0.1}{127.0.0.1:9300}] 12:41:34.620" o.s.d.e.r.s.AbstractElasticsearchRepository
Is it correct path? @Value("${elasticsearch.home:/home/vidyesh/.m2/repository/org/elasticsearch/client/transport/6.3.2}")
@vidy you're next error message seems to say that elastic search servers you have configured in your application are not there (not started, not at this address, and / or not listening on right port). Please take also a moment to read the stackoverflow faq : to keep the site usable for everybody, comments should be related to the answer / question they are on, and not contains new questions to solve. If you have a new problem, you should raise a new question :)
just a small note, please remove the versions from your dependencies, if they are spring-* for sure, and let the parent handle them
|
2

You need to add spring-data-elasticsearch.jar file into your class path. The error is showing because of this small mistake.

Comments

0

Shorten command line inside Run Configuration

Adding shorten command line JAR manifest to run configuration solved the problem for me.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.