java - Hibernate Spring MVC 注入(inject) Autowiring 问题

标签 java spring hibernate spring-mvc

我正在尝试学习 Spring MVC 和 Hibernate,因为我认为它们很简单,而且那些注解看起来很有趣。但我错了。那些注解让人头疼,而且很难调试。请有人帮我调试它们。

这是我的 spring-servlet:

<context:component-scan base-package="com.isad" />
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" cache-period="31556926"/>

<!-- 
    Initialize base viewers 
--> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>

<bean id="sessionFactory" scope="singleton"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>

<bean id="employeeDao" class="com.isad.dao.impl.EmployeeDaoImpl" />
<bean id="employeeManager" class="com.isad.service.impl.EmployeeManagerImpl" />

<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- Springs Hibernate Transaction Manager -->
<bean id ="transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name = "sessionFactory" ref = "sessionFactory"/>
</bean>

我的 hibernate.cfg.xml:

<hibernate-configuration>
<session-factory>

    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/database</property>
    <property name="hibernate.connection.username">datatables</property>
    <property name="hibernate.connection.password">datapassword</property>

    <property name="connection.pool_size">1</property>

    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>

    <property name="current_session_context_class">thread</property>
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
    <property name="show_sql">true</property>

    <mapping resource="com.isad.model.EmployeeEntity"/>
</session-factory>

我的模型:

@Entity
@Table(name="EMPLOYEE")
public class EmployeeEntity {
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @Column(name="FIRSTNAME")
    private String firstname;

    @Column(name="LASTNAME")
    private String lastname;

    @Column(name="EMAIL")
    private String email;

    @Column(name="TELEPHONE")
    private String telephone;
}

我的 DAO:

@Repository
public class EmployeeDaoImpl implements EmployeeDAO {
@Autowired
private SessionFactory sessionFacoty;

@Override
public void addEmployee(EmployeeEntity employee) {
    this.sessionFacoty.getCurrentSession().save( employee );
}

@SuppressWarnings("unchecked")
@Override
public List<EmployeeEntity> getAllEmployee() {
    return this.sessionFacoty.getCurrentSession()
            .createQuery("FROM EmployeeEntity").list();
}

@Override
public void deleteEmployee(Integer employeeId) {
    EmployeeEntity employee = (EmployeeEntity) sessionFacoty
                                .getCurrentSession()
                                .load(EmployeeEntity.class, employeeId);

    if( null != employee ) {
        this.sessionFacoty.getCurrentSession().delete(employee);
    }
}

我的服务:

@Service
public class EmployeeManagerImpl implements EmployeeManager {

@Autowired
private EmployeeDAO employeeDao;

@Override
@Transactional
public void addEmployee(EmployeeEntity employee) {
    employeeDao.addEmployee(employee);
}

@Override
@Transactional
public List<EmployeeEntity> getAllEmployee() {
    return employeeDao.getAllEmployee();
}

@Override
@Transactional
public void deleteEmployee(Integer employeeId) {
    this.employeeDao.deleteEmployee(employeeId);
}

public void setEmployeeDao( EmployeeDAO employeeDao ) {
    this.employeeDao = employeeDao;
}

这是我的 Controller :

@Controller
public class EditEmployeeController {

@Autowired
private EmployeeManager employeeManager;

@RequestMapping(value="/", method=RequestMethod.POST)
public String listEmployees( ModelMap map) {
    map.addAttribute("employee", new EmployeeEntity());
    map.addAttribute("employeeList", employeeManager.getAllEmployee());
    return "redirect:/";
}

@RequestMapping(value="/add", method=RequestMethod.POST)
public String addEmployee( 
        @ModelAttribute(value="employee") EmployeeEntity employee,
        BindingResult result) {
    employeeManager.addEmployee(employee);
    return "redirect:/";
}

@RequestMapping("/delete/{employeeId}")
public String deleteEmployee( @PathVariable("employeeId")Integer employeeId) {
    employeeManager.deleteEmployee(employeeId);
    return "redirect:/";
}

所以当我运行我的索引页面时,我得到这个错误:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeManagerImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.isad.dao.EmployeeDAO com.isad.service.impl.EmployeeManagerImpl.employeeDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeDaoImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.isad.dao.impl.EmployeeDaoImpl.sessionFacoty; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at   org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire   field: private com.isad.dao.EmployeeDAO    com.isad.service.impl.EmployeeManagerImpl.employeeDao; nested exception is    org.springframework.beans.factory.BeanCreationException: Error creating bean with name    'employeeDaoImpl': Injection of autowired dependencies failed; nested exception is    org.springframework.beans.factory.BeanCreationException: Could not autowire field: private    org.hibernate.SessionFactory com.isad.dao.impl.EmployeeDaoImpl.sessionFacoty; nested   exception is org.springframework.beans.factory.BeanCreationException: Error creating bean   with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]:   Invocation of init method failed; nested exception is java.lang.NullPointerException
at  org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredF ieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at  org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java :87)
at  org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 22 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeDaoImpl': Injection of autowired dependencies failed; nested exception is   org.springframework.beans.factory.BeanCreationException: Could not autowire field: private  org.hibernate.SessionFactory com.isad.dao.impl.EmployeeDaoImpl.sessionFacoty; nested  exception is org.springframework.beans.factory.BeanCreationException: Error creating bean  with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]:  Invocation of init method failed; nested exception is java.lang.NullPointerException
at  org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(Ab stractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 24 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.isad.dao.impl.EmployeeDaoImpl.sessionFacoty; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 35 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 37 more
Caused by: java.lang.NullPointerException
at  org.apache.catalina.loader.WebappClassLoader.findLoadedResource(WebappClassLoader.java:3342)
at org.apache.catalina.loader.WebappClassLoader.getResourceAsStream(WebappClassLoader.java:1499)
at org.hibernate.cfg.Configuration.addResource(Configuration.java:761)
at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2255)
at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2227)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2207)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2160)
at org.hibernate.cfg.Configuration.configure(Configuration.java:2111)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:329)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
... 47 more

我该怎么做才能修复崩溃?

最佳答案

你的问题是

<mapping resource="com.isad.model.EmployeeEntity"/>

该声明应该指向一个 XML 资源,它可以用来为一个类型生成映射。

你可能想要

<mapping class="com.isad.model.EmployeeEntity"/> // or whatever your class name is

关于java - Hibernate Spring MVC 注入(inject) Autowiring 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410379/

相关文章:

java - Play Framework 1.2.5 Hibernate 升级到 v 4.2.4

java - 如何让程序在按下 1 或 2 时吐出任何 "if"语句?

java - 构建中的 Android Studio 错误 - 原因 : startElement. getAttributeByName(QName ("name")) 不能为空

spring - Spring 安全网址中的双星正则表达式意味着什么

java - 如何拆分类以使用多个@Controller

hibernate - 使用 JConsole 监控 c3p0(使用 hibernate 和 Tomcat)

java - 为什么我在这段代码中收到 NoSuchMethodError 错误?

java - 更改按钮文本而不更改按钮大小

java - JJWT/Jackson 改变了使用的 ObjectMapper

sql - 使用 Hibernate 的标准和投影来选择多个不同的列