我是春季和冬眠的新手,正在尝试创建简单的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>
我遇到了其他类似的问题,但这无济于事。
答案 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();
}