Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

注入数据源失败,与已有数据源冲突 #2304

Closed
lvjun2015 opened this issue Feb 26, 2020 · 8 comments
Closed

注入数据源失败,与已有数据源冲突 #2304

lvjun2015 opened this issue Feb 26, 2020 · 8 comments

Comments

@lvjun2015
Copy link

公司工程中已有数据源配置如下,并且该代码以jar包形式导入,无法修改
@bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
return sessionFactory.getObject();
}

在与seata集成中 需要注入数据源如下
@configuration
public class SeataDataSourceProxyConfig {

@Bean
@ConfigurationProperties(prefix = "datasource")
public DataSource dataSource() {
    return new DruidDataSource();
}

@Bean
public DataSourceProxy dataSourceProxy(DataSource dataSource) {
    return new DataSourceProxy(dataSource);
}

@Bean
public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSourceProxy);
    return sqlSessionFactoryBean.getObject();
}

}

项目启动报错,Description:

file [xx.class required a single bean, but 2 were found:
- sqlSessionFactoryBean: defined by method 'sqlSessionFactoryBean' in class path resource [com/xx/SeataDataSourceProxyConfig.class]
- sqlSessionFactory: defined by method 'sqlSessionFactory' in class path resource [cn/xx//config/MybatisConfig.class]

请问这种情况如何处理?

@zjinlei
Copy link
Contributor

zjinlei commented Feb 26, 2020

use seata auto DataSource proxy
https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

@lvjun2015
Copy link
Author

@EnableAutoDataSourceProxy
public class Application{}

按照如上方法报以下错

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [xx/DataSourceConfig.class]: Initialization of bean failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:522)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:627)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)
... 62 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.alibaba.druid.pool.DruidDataSource$$EnhancerBySpringCGLIB$$ede5d66b.getTargetClass()
at org.springframework.aop.framework.AopProxyUtils.ultimateTargetClass(AopProxyUtils.java:80)
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:310)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1638)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
... 73 common frames omitted

@slievrly
Copy link
Member

@lvjun2015 Does the project depend on seata-all or seata-spring-boot-starter?

@lvjun2015
Copy link
Author

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>

@lvjun2015
Copy link
Author

还发现一个问题,数据源被代理后,其他逻辑原有的方法的本地事务也失效了

@slievrly
Copy link
Member

@lvjun2015 please depend on spring-cloud-alibaba-seata 2.2.0. RELEASE and reimport seata-spring-boot-starter 1.1.0.

@xingfudeshi
Copy link
Member

还发现一个问题,数据源被代理后,其他逻辑原有的方法的本地事务也失效了

try this PR #2323

@funky-eyes
Copy link
Contributor

自动代理开启后
@Bean public DataSourceProxy dataSourceProxy(DataSource dataSource) { return new DataSourceProxy(dataSource); }
没有存在的必要了

@zjinlei zjinlei closed this as completed May 5, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants