将Spring项目从xml更改为Annotation

时间:2016-06-02 11:59:11

标签: java xml spring hibernate spring-mvc

我正在一个项目工作,我想更新从基于xml的配置到基于注释。我在服务层成功完成了这项工作,但是DAO层遇到了麻烦。我有扩展BaseDAO的DAO类,这个BaseDAO扩展了HibernateDaoSupport。我想用@Repository注释DAO类,并将组件扫描添加到我的context.xml。我认为这个问题与我的DAO对BaseDAO的继承有关? 这是我目前无法解决问题的代码

@Repository ("userDAO")
public class UserDAOImpl extends BaseDAO implements IUserDAO {


   @Override
   public Integer saveUser(UserVO user) {

       user.setDateCreated(MyDateUtils.getCurrentDate());
       user.setDateUpdated(MyDateUtils.getCurrentDate());

       Integer userId = performSave(user);
       return userId;
   }

这是我的BaseDAO

public class BaseDAO extends HibernateDaoSupport {



public Integer performSave(Object object) {
    Integer id = null;
    try {
        id = (Integer) getHibernateTemplate().save(object);
    } catch (DataAccessException e) {

    }
    return id;
}

这是BaseDAO的

<bean id="baseDAO" class="com.my.dao.database.base.BaseDAO"
    abstract="true">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="MyDataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.showSQL}</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.my.domain.dao.UserVO</value>
        </list>
    </property>
</bean>

在我的context.xml中我使用

- 这是UserDAO(可行)的旧配置

    <bean id="userDAO" class="com.my.dao.database.impl.UserDAOImpl"
    parent="baseDAO" />

所以更清楚一点,我摆脱了UserDAO的这个xml bean定义并使用了@Repository但它停止了工作并抛出了java.lang.IllegalArgumentException:&#39; sessionFactory&#39;或者&#39; hibernateTemplate&#39;是必需的

2 个答案:

答案 0 :(得分:0)

您必须在DaoImpl类中使用@Autowire标记sessionFactory。

答案 1 :(得分:0)

我认为这个问题是关于同样的问题:

Spring 3 Annotations - HibernateDaoSupport - Repository Requires Session Factory

我分享了选定的答案:

  

HibernateDaoSupport通过SessionFactorysetSessionFactory()提供。但是,setSessionFactory()final,因此您无法覆盖它以添加@Autowired注释。但您可以将@Autowired应用于任意方法并从中调用setSessionFactory()

@Autowired
public void init(SessionFactory factory) {
    setSessionFactory(factory);
}

希望有所帮助

详细说明:

向DAO提供SessionFactory的原始方法不会从IoC容器中获取de SessionFactory,因为没有@Autowired。

您可以添加它来创建一个覆盖该方法的子类,并且具有注释,但是因为该方法是最终的,所以不能。

因此,由于您无法自动为setter提供依赖项,因此您唯一的方法是手动执行。上面的方法包含了SessionFactory的注释。要在创建DAO时调用它,可以使用@PostConstruct:

@PostConstruct
@Autowired
public void init(SessionFactory factory) {
    setSessionFactory(factory);
}