2011-11-19 94 views
2

我試圖做一個項目使用Spring MVC和JPA,但我有一個問題,當我試圖啓動應用程序 - 有一個異常,看起來像本(每幾行): 例外autowire異常,同時試圖設置彈簧和jpa與休眠適配器

javax.servlet.ServletException: Servlet.init() for servlet appServlet threw exception 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 

根源

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.lovemyway.itlovers.persistence.JpaUserDao com.lovemyway.itlovers.controllers.HomeController.jpaUserDao; nested exception is java.lang.IllegalArgumentException: Can not set com.lovemyway.itlovers.persistence.JpaUserDao field com.lovemyway.itlovers.controllers.HomeController.jpaUserDao to $Proxy33 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 

我的代碼如下所示: JpaUserDao.java

package com.lovemyway.itlovers.persistence; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

import com.lovemyway.itlovers.domain.User; 

@Repository("jpaUserDao") 
@Transactional 
public class JpaUserDao implements UserDao { 
@PersistenceContext 
private EntityManager em; 

public void addUser(User user) { 
    em.persist(user); 
} 

public void removeUser(User user) { 
    em.remove(user); 
} 

public User findUserById(int id) { 
    return em.find(User.class, id); 
} 
} 

的servlet-context.xml的

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:security="http://www.springframework.org/schema/security" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 

<!-- Enables the Spring MVC @Controller programming model --> 
<mvc:annotation-driven /> 

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="/WEB-INF/views/" /> 
    <beans:property name="suffix" value=".jsp" /> 
</beans:bean> 

<context:component-scan base-package="com.lovemyway.itlovers" /> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

<beans:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
    <property name="persistenceUnitName" value="ITlovers"/> 
</beans:bean> 

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/itlovers" /> 
    <property name="username" value="root" /> 
    <property name="password" value="root" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxActive" value="10" /> 
</beans:bean> 

<beans:bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="database" value="MYSQL" /> 
    <property name="showSql" value="true"/> 
    <property name="generateDdl" value="false"/> 
    <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
</beans:bean> 

<beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</beans:bean> 

<beans:bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
<beans:bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 
</beans> 

而且控制器導致異常:

HomeController.java

package com.lovemyway.itlovers.controllers; 

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 

import com.lovemyway.itlovers.domain.Rank; 
import com.lovemyway.itlovers.domain.User; 
import com.lovemyway.itlovers.persistence.JpaUserDao; 

/** 
* Handles requests for the application home page. 
*/ 
@Controller 
public class HomeController { 

private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 
@Autowired 
private JpaUserDao jpaUserDao; 

/** 
* Simply selects the home view to render by returning its name. 
*/ 
@RequestMapping(value = "/", method = RequestMethod.GET) 
public String home(Locale locale, Model model) { 
    logger.info("Welcome home! the client locale is "+ locale.toString()); 
    Date date = new Date(); 
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

    String formattedDate = dateFormat.format(date); 

    Rank r = new Rank(); 
    r.setColor("aa"); 
    r.setDescription("a4aa"); 
    r.setName("ranga"); 

    User u = new User(); 
    u.setActive(true); 
    u.setAdmin(true); 
    u.setUsername("szaku2"); 
    u.setEmail("aaa"); 
    u.setPassword("aaa"); 
    u.setRegistrationDate(date); 
    u.setLastLoginDate(date); 
    u.setRank(r); 
    jpaUserDao.addUser(u); 
    jpaUserDao.findUserById(2); 
    model.addAttribute("serverTime", formattedDate); 

    return "home"; 
} 
} 

我在做什麼錯?我很困惑太多的XML文件..如果我使用新的構造函數實例化jpaUserDao(我猜我註釋了它@Repository不這樣做)我得到了NullPointerException。

問候, 馬辛

回答

3

你應該使用接口,而不是實現類聲明的領域你的情況不這樣做不允許Spring將interface-based proxy注入該字段。

JpaUserDao的基於接口的代理被創建以提供@Repository@Transactional所需的行爲。

+0

謝謝,先生,您爲我節省了很多時間:)。關於Repository註釋,我還有一個問題 - 圓括號中的名稱是什麼? – Marcin

0

你缺少你jpaUserDao二傳手。

以下內容添加到您的HomeController:

@Autowired 
private UserDao userDao; 

除了事實,這是一個很好的設計實踐,在:

public setJpaUserDao(JpaUserDao jpaUserDao){ 
    this.jpaUserDao = jpaUserDao; 
} 
+0

添加後,我在運行服務器時沒有更多的異常,但在嘗試調用addUser時,我得到了NullPointerException(jpaUserDao爲空) – Marcin