1

I am new to spring and hibernate and trying to create simple webapp. but i am stuck on this error for several days. When I tried to run junit test this error is showing. what am i missing here?

Exception encountered during context initialization - cancelling refresh attempt: 
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'categoryDAO': Unsatisfied dependency expressed through field 
'sessionFactory'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No qualifying bean of type 'org.hibernate.SessionFactory' available:
 expected at least 1 bean which qualifies as autowire candidate. 
 Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

my entity class Category.java

@Entity
public class Category {

/*
 * private fields
 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String description;
@Column(name = "img_url")
private String imageurl;
@Column(name = "is_active")
private boolean active = true;

/*
 * getters and setters
 */

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getImageurl() {
    return imageurl;
}

public void setImageurl(String imageurl) {
    this.imageurl = imageurl;
}

public boolean isActive() {
    return active;
}

public void setActive(boolean active) {
    this.active = active;
}

@Override
public String toString() {
    return "Category [id=" + id + ", name=" + name + ", description=" + description + ", imageurl=" + imageurl
            + ", active=" + active + "]";
}
}

PageController.java

@Controller
public class PageController {

@Autowired
private CategoryDAO categoryDAO;

@RequestMapping(value = { "/", "/home", "/index" })
public ModelAndView index() {
    ModelAndView mv = new ModelAndView("page");
    mv.addObject("title", "home");

    //passing the list of categories
    mv.addObject("categories", categoryDAO.list());
    mv.addObject("userClickHome", true);

    return mv;
}

@RequestMapping(value = { "/about" })
public ModelAndView about() {
    ModelAndView mv = new ModelAndView("page");
    mv.addObject("title", "About us");
    mv.addObject("userClickAbout", true);
    return mv;
}

@RequestMapping(value = { "/contact" })
public ModelAndView contact() {
    ModelAndView mv = new ModelAndView("page");
    mv.addObject("title", "Contact us");
    mv.addObject("userClickContact", true);
    return mv;
}

@RequestMapping(value = "/show/all/products")
public ModelAndView showAllProducts() {
    ModelAndView mv = new ModelAndView("page");
    mv.addObject("title", "All products");

    //passing the list of categories
    mv.addObject("categories", categoryDAO.list());
    mv.addObject("userClickAllProducts", true);
    return mv;
}

@RequestMapping(value = "/show/category/{id}/products")
public ModelAndView showCategoryProducts(@PathVariable("id") int id) {
    ModelAndView mv = new ModelAndView("page");

    //  categoryDAO to fetch a single category
    Category category = null;

    category = categoryDAO.get(id);

    mv.addObject("title", category.getName());

    //passing the list of categories
    mv.addObject("categories", categoryDAO.list());

    //passing the list of category object
    mv.addObject("category", category);

    mv.addObject("userClickCategoryProducts", true);

    return mv;
}
}

CategoryDAOimpl.java

@Repository("categoryDAO")
public class CategoryDAOImpl implements CategoryDAO {

@Autowired
private SessionFactory sessionFactory;
private static List<Category> categories = new ArrayList<>();
//private static CategoryDAO categoryDAO;

static {

    Category category = new Category();

    // first category
    category.setId(1);
    category.setName("Television");
    category.setDescription("This is some description for television");
    category.setImageurl("CAT_1.png");

    categories.add(category);

    // second category
    category = new Category();
    category.setId(2);
    category.setName("Mobile");
    category.setDescription("This is some description for mobile");
    category.setImageurl("CAT_2.png");

    categories.add(category);

    // third category
    category = new Category();
    category.setId(3);
    category.setName("laptop");
    category.setDescription("This is some description for laptop");
    category.setImageurl("CAT_3.png");

    categories.add(category);
}

@Override
public List<Category> list() {
    // TODO Auto-generated method stub
      return categories;
}

@Override
public Category get(int id) {

    //ecnhanced for loop

    for(Category category : categories) {
        if(category.getId() == id) return category;
    }
    return null;
}

@Override
@Transactional
public boolean add(Category category) {
    try {
        //add the category to the database table
        sessionFactory.getCurrentSession().persist(category);
        return true;
    } catch (Exception e) {
         e.printStackTrace();
         return false;
    }
 }

 }

interface CategoryDAO.java

@Service
public interface CategoryDAO {
List<Category> list();
Category get(int id);
boolean add(Category category);
}

HibernateConfig.java

@Configuration
@ComponentScan(basePackages = {"net.kzn.shoppingbackend.dao"})
@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 = "";

// database bean will be available
@Bean
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
public SessionFactory getSessionFactory(DataSource dataSource) {

    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource);

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

    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");

    return properties;
}

// transactionManager bean

public HibernateTransactionManager geTransactionManager(SessionFactory sessionFactory) {

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

}

CategoryTestCase.java

public class CategoryTestCase {

private static AnnotationConfigApplicationContext context;
private static CategoryDAO categoryDAO;

private Category category;

@BeforeClass
public static void init() {
    context = new AnnotationConfigApplicationContext();
    context.scan("net.kzn.shoppingbackend");
    context.refresh();
    categoryDAO = (CategoryDAO) context.getBean("categoryDAO");
}

@Test
public void testAddCategory() {

    category = new Category();

    category.setName("Television");
    category.setDescription("This is some description for television");
    category.setImageurl("CAT_1.png");

    assertEquals("successfully added a category inside the table!", true, categoryDAO.add(category));
}
}

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>4.3.19.RELEASE</spring.version>
    <hibernate.version>5.2.7.Final</hibernate.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-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</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>
        <exclusions>
            <exclusion>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!-- database connection pooling  -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.1.1</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>
</project>

I go through other similar questions but that dosen't help.

4
  • 1
    where is @Bean here public SessionFactory getSessionFactory(DataSource dataSource) ? Commented Oct 20, 2018 at 16:01
  • I added @bean as you said before public SessionFactory getSessionFactory(DataSource dataSource) and public HibernateTransactionManager geTransactionManager(SessionFactory sessionFactory) and it solve my problem. thank you. Commented Oct 20, 2018 at 16:52
  • Error gone?. Any more error? Commented Oct 20, 2018 at 16:53
  • 1
    yes error gone and test ran successfully. Commented Oct 20, 2018 at 16:54

1 Answer 1

3

As confirmed by the user,

Adding @Bean to SessionFactory has resolved the issue,

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

    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource);

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

    return builder.buildSessionFactory();
}
Sign up to request clarification or add additional context in comments.

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.