当前位置: 首页 > 知识库问答 >
问题:

怪异的Spring“无法解决的循环参考问题”

淳于嘉树
2023-03-14

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

组织。springframework。豆。工厂BeanCreationException:创建名为“cpnRepository”的bean时出错:自动连线依赖项的注入失败;嵌套的异常是org。springframework。豆。工厂BeanCreationException:无法自动关联字段:私有组织。冬眠SessionFactory组织。全国人大常委会。ccms。刀。GenericDB1Dao。会期工厂;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建名为“DB1Config”的bean时出错:自动连线依赖项的注入失败;嵌套的异常是org。springframework。豆。工厂BeanCreationException:无法自动关联字段:私有组织。冬眠SessionFactory组织。全国人大常委会。ccms。配置。db。数据库配置。会期工厂;嵌套的异常是org。springframework。豆。工厂BeanCurrentlyIncrementException:创建名为“DB1SessionFactory”的bean时出错:请求的bean当前正在创建中:是否存在无法解析的循环引用?

以下是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;        

    }

}

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

数据库配置

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

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

共有1个答案

包唯
2023-03-14

我认为您的问题来自这样一个事实:您正在创建一个LocalSessionFactoryBean,同时尝试自动连接SessionFactory。。。

DB1Config类中,您不需要该类成员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
public SessionFactory sessionFactory() {
    return db1SessionFactory().getObject();
}
 类似资料:
  • 本文向大家介绍spring循环注入异常问题的解决方案,包括了spring循环注入异常问题的解决方案的使用技巧和注意事项,需要的朋友参考一下 今天在做项目的时候突然遇到一个问题:启动服务器的时候spring没报错,可是当我访问某个页面的时候spring报Request bean is currently in creation: is there an unresolvable circular r

  • 我已经在Android Studio中编写了它,也在同一个项目中与Kotlin一起工作。这是我的java代码的错误列表(按照Android Studio扔给我的顺序): 无法解析符号“重写” 无法解析方法“在创建时(?)” 无法解析符号“Saved InstanceState” 无法解析方法“在创建时(?)” 无法解析符号“Saved InstanceState” 无法解析方法“Set Conte

  • 问题内容: 我有一个目录结构 而且我可以使用访问网络模块。 但是,pycharm抱怨它无法访问该模块。我该如何教pycham解析参考文献? 问题答案: 手动将其添加为你所做的确实这样做的一种方式,但有一个简单的方法,那就是通过简单地告诉要在添加文件夹作为源根目录,然后添加源根你的Python路径。 这样,你就不必将代码硬编码到解释器的设置中: 添加为源内容根: 然后确保将添加源添加到你的: 这样,

  • 问题内容: 下面是我的控制器,它从sql db中读取数据,然后尝试将结果编码为JSON并将数据发送回我的gridview.js 这就是问题所在,使用上面的代码,我在执行gridview.js时得到了没有数据的gridview表,但是如果我直接访问控制器的方法是这样的 我得到这个错误, 序列化类型为’System.Globalization.CultureInfo’的对象时,检测到循环引用。 说明:

  • 我试图遵循这里给出的例子:https://developer.android.com/topic/security/data 我已经在我的gradle中包含了必需的库: 然而,当我尝试使用代码时: 我得到一个未解决的引用:MasterKey错误。图书馆有那门课吗? 提前谢谢。

  • 本文向大家介绍详解vue beforeEach 死循环问题解决方法,包括了详解vue beforeEach 死循环问题解决方法的使用技巧和注意事项,需要的朋友参考一下 什么是beforeEach? beforeEach 是一个vue-router的路由导航钩子,一般我用它做路由守卫。 什么是路由守卫? 路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。对此,vue-route 提供的befo