2014-07-28 3 views
-2

Я знаю, что есть несколько таких проблем, но я до сих пор не могу понять, почему мой пример не работает.Впрыск зависимых от автоподстановки Spring

У меня есть проект Spring MVC, в котором у меня есть контроллер:

@Controller 
public class StudentController { 

    /** The Constant serialVersionUID. */ 
    private static final long serialVersionUID = 1L; 
    private static Logger log = Logger.getLogger(StudentController.class); 

    @Autowired 
    @Qualifier("studentsManager") 
    IStudentsManager studentsManager; 

    @Autowired 
    @Qualifier("departmentsManager") 
    IDepartmentsManager departmentsManager; 
... 

StudentsManager класс:

@Transactional 
@Repository 
public class StudentsManager extends JdbcDaoSupport implements IStudentsManager { 

    @Autowired 
    @Qualifier("departmentsManager") 
    private IDepartmentsManager departmentsManager; 
... 

DepartmentsManager класс:

@Transactional 
@Repository 
public class DepartmentsManager extends JdbcDaoSupport implements 
     IDepartmentsManager { 

    /** The log. */ 
    private static Log log = LogFactory.getLog(DepartmentsManager.class); 

    /** The departments. */ 
    private List<Department> departments = new ArrayList<Department>(); 


    public void addDepartment(int id, String name) { 
     Department d = new Department(id, name); 
     departments.add(d); 
    } 


    public void addDepartment(Department department) 
      throws FileNotFoundException { 
     if (log.isDebugEnabled()) { 
      log.debug("Entered to add department method "); 
     } 
     departments.add(department); 
     StringBuilder sb = new StringBuilder(); 
     sb.append(department.toString()).append(" added"); 
     log.info(sb.toString()); 

     this.serialize(); 
    } 

    public Department getDepartment(int departmentId) { 
     if (log.isDebugEnabled()) { 
      log.debug("Entered to getDepartment"); 
     } 
     for (Department d : departments) { 
      if (departmentId == d.getDepartmentId()) { 
       return d; 
      } 
     } 
     return null; 
    } 

    public Collection<Department> getAllDepartments() throws SQLException, 
      ClassNotFoundException { 
     if (log.isDebugEnabled()) { 
      log.debug("Entered to getAllDepartments"); 
     } 

     departments.clear(); 

     Class.forName("com.mysql.jdbc.Driver"); 
     String sql = "SELECT id, name FROM departments ORDER BY id"; 
     RowMapper<Department> rm = ParameterizedBeanPropertyRowMapper 
       .newInstance(Department.class); 
     return getJdbcTemplate().query(sql, rm); 
    } 

    public void serialize() throws FileNotFoundException { 
     XStream xstream = new XStream(); 
     xstream.alias("departments", List.class); 
     System.out.println(xstream.toXML(departments)); 
     FileOutputStream fos = new FileOutputStream("departments.xml", true); 
     xstream.toXML(departments, fos); 
    } 

    public void deserialize() throws FileNotFoundException { 
     XStream xstream = new XStream(); 
     xstream.alias("departments", List.class); 
     departments = (List<Department>) xstream.fromXML(new FileInputStream(
       "departments.xml")); 
    } 

} 

Весь контекст применения:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="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:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"> 

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

    <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven conversion-service="conversionService" /> 

    <context:component-scan base-package="amg.net.controller, amg.net.services" /> 

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

    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <beans:property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <beans:property name="url" value="${jdbc.url}" /> 
     <beans:property name="username" value="${jdbc.username}" /> 
     <beans:property name="password" value="${jdbc.password}" /> 
    </beans:bean> 

    <context:property-placeholder location="classpath:jdbc.properties" /> 

    <beans:bean id="studentsManager" class="amg.net.services.StudentsManager"> 
     <beans:property name="dataSource" ref="dataSource" /> 
    </beans:bean> 

    <beans:bean id="departmentsManager" class="amg.net.services.DepartmentsManager"> 
     <beans:property name="dataSource" ref="dataSource" /> 
    </beans:bean> 

</beans:beans> 

Стек след:

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 'studentController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: amg.net.services.IStudentsManager amg.net.controller.StudentController.studentsManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentsManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private amg.net.services.IDepartmentsManager amg.net.services.StudentsManager.departmentsManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'departmentsManager' defined in file [/home/praktykant/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Students/WEB-INF/classes/amg/net/services/DepartmentsManager.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    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: amg.net.services.IStudentsManager amg.net.controller.StudentController.studentsManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentsManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private amg.net.services.IDepartmentsManager amg.net.services.StudentsManager.departmentsManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'departmentsManager' defined in file [/home/praktykant/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Students/WEB-INF/classes/amg/net/services/DepartmentsManager.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    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) 
    ... 22 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentsManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private amg.net.services.IDepartmentsManager amg.net.services.StudentsManager.departmentsManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'departmentsManager' defined in file [/home/praktykant/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Students/WEB-INF/classes/amg/net/services/DepartmentsManager.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    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.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 amg.net.services.IDepartmentsManager amg.net.services.StudentsManager.departmentsManager; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'departmentsManager' defined in file [/home/praktykant/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Students/WEB-INF/classes/amg/net/services/DepartmentsManager.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    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 'departmentsManager' defined in file [/home/praktykant/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Students/WEB-INF/classes/amg/net/services/DepartmentsManager.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    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.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 
    at org.springframework.jdbc.core.support.JdbcDaoSupport.checkDaoConfig(JdbcDaoSupport.java:112) 
    at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) 
    ... 47 more 

Я всегда делал это без спецификатора и он всегда работал, но не в этот раз. Поэтому я добавил эти аннотации, но все равно не работает.

Похоже, что компонент-сканирование не работает, но я пытался сделать с ним некоторые изменения, и это было то же самое, поэтому я думаю, что проблема не связана с ним.

web.xml файл:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- The definition of the Root Spring Container shared by all Servlets 
     and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
     /WEB-INF/spring/root-context.xml, 
     /WEB-INF/spring/security.xml 
     </param-value> 
    </context-param> 

    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>students</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>students</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>/</welcome-file> 
    </welcome-file-list> 

    <filter> 
     <filter-name>charsetEncodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 

     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>charsetEncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- Spring Security --> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class> 
        org.springframework.web.filter.DelegatingFilterProxy 
       </filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 
+0

Есть ли аннотации '@ Repository' в ваших классах менеджера? Если не добавить его и попробовать aggain. – Jens

+0

Я добавил @Repository аннотации, но все равно те же –

+0

Являются ли классы в pagacke 'amg.net.controller' или' amg.net.services'? – Jens

ответ

1

Вы должны аннотировать StudentsManager и DepartmentsManager либо с @Component, @Repository или @Service на основании того, что делают эти классы.

А также убедитесь, что они подпадают под упаковки, которые вы сканируете весной.

+0

Okey, он решил немного проблему, но у меня все еще есть: Ошибка создания bean с именем «departmentManager»: вызов метода init не удался; Вложенное исключение - это java.lang.IllegalArgumentException: требуется «dataSource» или «jdbcTemplate». –

+0

нужно посмотреть на DepartmentsManager class –

+0

. Два компонента были объявлены в xml, чтобы они были найдены. –

Смежные вопросы