coder
coder

Reputation: 6233

Why won't this dao class autowire?

Please look at the files below and tell me why the Dao will not autowire. It autowires correctly when the same setter is put in a controller. I put it in this class and it does not work.

Business Class

@Component
public class AuthenticateUser {

    @Autowired
    private SecurityDAO securityDAO;

    public void setSecurityDAO(SecurityDAO securityDAO) {
        this.securityDAO = securityDAO;
    }

    protected void execute() {          
        User authenticatedUser = securityDAO.login(get_userName(),
                                                   get_password());     
    }
}

application-context.xml

    <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:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-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/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    <bean id="myDataSource" 
    class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
      <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
      </property>
      <property name="url">
        <value>jdbc:mysql://localhost/dbname</value>
      </property>
      <property name="username">
        <value>un</value>
      </property>
      <property name="password">
        <value>pw</value>
      </property>
      <!-- Disable the second-level cache  -->
        <!-- Echo all executed SQL to stdout -->
    </bean>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" /> 
        <property name="annotatedClasses">
            <list>
            <value>com.projectname.model.SecurityInfo</value>
            <value>com.projectname.model.User</value>
            <value>com.projectname.model.Post</value>
            <value>com.projectname.model.Article</value>
            <value>com.projectname.model.Address</value>
            </list>
        </property> 
        <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
        </property>
    </bean>


    <bean id="mySecurityInfoDAO" class="com.projectname.dao.SecurityDAOImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    </beans>

spring-servlet.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-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/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:annotation-config />
<context:component-scan
    base-package="com.projectname" />
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <value>/WEB-INF/messages/messages</value>
    </property>
    <property name="cacheSeconds" value="60" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>
</beans>

Upvotes: 1

Views: 2342

Answers (1)

Ralph
Ralph

Reputation: 120831

Let my guess: AuthenticatedUser is a Domain Entity?

Spring can only handle Spring Beans, and can only inject in Spring Beans.

If you have a class that is instantiated in a Pojo way by new (or loaded form the database by Hibernate/JPA,...) it does not become a Spring Bean.

But you can make even this Pojos become Spring Beans. You need 3 things:

  • add @Configurable to the Entity
  • turn on Spring Configurable support:
  • enable AspectJ (AspectJ not Spring AOP) - compiletime or loadtime weaving. -- If you use compiletime weaving you need to use an AspectJ Compiler

@See:

Upvotes: 8

Related Questions