2016-06-02 1 views
0

Я работаю над проектом, и я хочу обновить, если из xml-конфигурации на основе аннотации. Я успешно сделал это на уровне обслуживания, но столкнулся с уровнем DAO. У меня есть классы DAO, которые расширяют BaseDAO, этот BaseDAO расширяет HibernateDaoSupport. Я хочу комментировать классы DAO с помощью @Repository и добавить проверку компонентов в мой контекст.xml. Я думаю, проблема связана с наследованием от моего DAO до BaseDAO? это мой текущий код, который не работает, который объясняет проблему лучшеИзменение проекта Spring от xml до аннотации

@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; 
} 

и это XML боб для 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> 

и в моем контексте.xml я использую

- и это старая конфигурация для UserDAO (который работает)

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

так, чтобы быть более ясным, я избавиться от этого определения XML боб для UserDAO и используется @Repository и, но он перестал работать и бросить java.lang.IllegalArgumentException: «SessionFactory 'или' hibernateTemplate 'требуется

ответ

0

Я думаю, что этот вопрос о той же проблеме:

Spring 3 Annotations - HibernateDaoSupport - Repository Requires Session Factory

делюсь выбранный ответ:

HibernateDaoSupport поставляется с SessionFactory через setSessionFactory(). Однако setSessionFactory() - final, поэтому вы не можете переопределить его, чтобы добавить аннотацию @Autowired. Но вы можете применить @Autowired к произвольному способу и вызовите setSessionFactory() из него:

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

Надеется, что это помогает

Подробного описание:

оригинальный метод, при условии, что SessionFactory к DAO не принимает SessionFactory из контейнера IoC, потому что не имеет @Autowired.

Вы можете добавить его, создавая дочерний класс, который переопределяет этот метод и имеет аннотацию, НО, потому что этот метод является окончательным, вы не можете.

Так как вы не можете автоматически обеспечить зависимость от сеттера, ваш единственный способ сделать это вручную. Вышеописанный метод обертывает inyection SessionFactory.Для того, чтобы весной называют его, когда DAO будет создан, вы можете использовать @PostConstruct:

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

Это на самом деле работает, но мне нужно, чтобы понять, что вы имеете в виду «так что вы не можете изменить его, чтобы добавить Autowired аннотацию» , означает ли это, что «Autowired» не может использоваться с любыми окончательными методами? –

+0

Я редактирую ответ с дополнительными пояснениями –

0

Вы должны пометить свой sessionFactory с помощью @Autowire в своем классе DaoImpl.

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