如何解决此问题:上下文初始化期间遇到异常-取消刷新尝试?

时间:2018-10-20 15:48:18

标签: java spring hibernate

我是春季和冬眠的新手,正在尝试创建简单的webapp。但是我在这个错误上停留了几天。 当我尝试运行junit test时,显示此错误。我在这里想念什么?

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)}

我的实体类 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;
    }
 }

 }

界面 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>

我遇到了其他类似的问题,但这无济于事。

1 个答案:

答案 0 :(得分:2)

经用户确认,

将@Bean添加到SessionFactory已解决了该问题,

// 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();
}