奇怪的弹簧“无法解决的循环引用问题”

Ram*_*amu 5 java spring annotations hibernate

在我的应用程序中,我们使用多个数据源,因此我们有多个数据库配置(会话工厂)。在我们的本地(whindows 机器)上一切正常,但是当我们将 war 文件部署到 Unix 应用程序时失败,出现以下异常:

org.springframework.beans.factory.BeanCreationException:创建名为“cpnRepository”的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.hibernate.SessionFactory org.npcc.ccms.dao.GenericDB1Dao.sessionFactory; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“DB1Config”的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.hibernate.SessionFactory org.npcc.ccms.config.db.DB1Config.sessionFactory; 嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creation bean with name '

这是 dao 的实现:

@Repository("cpnRepository")
public class ProgramNodeDaoImpl extends GenericDB1Dao<Integer, CustomProgramNode> implements CPNRepositoryDao {
    @Override
    public List<CustomProgramNode> findAllNodes() {
        Criteria criteria = createEntityCriteria();
        return (List<CustomProgramNode>) criteria.list();
    }

    @Override
    public List<CustomProgramNode> findByStatus(String status) {
        Query query = getSession().createQuery("from CustomProgramNode where status = :status");
        query.setParameter("status", status);
        List<CustomProgramNode> list = query.list();
        return list;        

    }

}
Run Code Online (Sandbox Code Playgroud)

DB1 的通用 DAO:

public abstract class GenericDB1Dao<PK extends Serializable, T> {

    private final Class<T> persistentClass;

    @SuppressWarnings("unchecked")
    public GenericAgrgtrDao(){
        this.persistentClass =(Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
    }

    @Autowired
    @Qualifier("DB1SessionFactory")
    private SessionFactory sessionFactory;

    protected Session getSession(){
        return sessionFactory.getCurrentSession();
    }

    @SuppressWarnings("unchecked")
    public T getByKey(PK key) {
        return (T) getSession().get(persistentClass, key);
    }

    public void persist(T entity) {
        getSession().persist(entity);
    }

    public void delete(T entity) {
        getSession().delete(entity);
    }

    protected Criteria createEntityCriteria(){
        return getSession().createCriteria(persistentClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

数据库 1 配置:

@Configuration
public class DB1Config {
    final static Logger logger = LogManager.getLogger(DB1Config.class);

    @Autowired
    private Environment environment;

    @Autowired
    @Qualifier("DB1SessionFactory")
    private SessionFactory sessionFactory;

    @Bean(name="DB1SessionFactory")
    public LocalSessionFactoryBean db1SessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "org.npcc.ccms.model.db1" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
     }

    @Bean(destroyMethod="")
    public DataSource dataSource() {
        JndiTemplate jndi = new JndiTemplate();
        DataSource dataSource = null;
        try {
            dataSource = (DataSource) jndi.lookup(environment.getRequiredProperty("datasource.db1"));
        } catch (NamingException e) {
        }
        return dataSource;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        return properties;        
    }
    @Primary
    @Bean(name="DB1TransactionManager")
    public HibernateTransactionManager db1TransactionManager() {
       HibernateTransactionManager txManager = new HibernateTransactionManager();
       txManager.setSessionFactory(this.sessionFactory);
       txManager.setDataSource(dataSource());
       return txManager;
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring是如何解决bean依赖的?为什么两个操作系统之间的顺序不一致?提前致谢。

Pra*_*ras 2

我认为你的问题来自于你正在创建一个LocalSessionFactoryBean并同时尝试自动装配SessionFactory......

sessionFactory您的班级中不需要该班级成员DB1Config,请尝试类似的操作:

@Bean(name="DB1SessionFactory")
public LocalSessionFactoryBean db1SessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(new String[] { "org.npcc.ccms.model.db1" });
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
 }

@Bean
public SessionFactory sessionFactory() {
    return db1SessionFactory().getObject();
}
Run Code Online (Sandbox Code Playgroud)