首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot 2.1.7版本-NoUniqueBeanDefinitionException

Spring Boot 2.1.7版本-NoUniqueBeanDefinitionException
EN

Stack Overflow用户
提问于 2019-09-25 16:05:11
回答 1查看 383关注 0票数 1

在将Spring迁移到Spring Boot2.1.7面临NoUniqueBeanDefinitionException.Bean条件时,XMLBoot2.1.7使用@ImportResources注解添加了该xml文件

代码语言:javascript
复制
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
62  SybaseUnit  INFO   [main] openjpa.Enhance - You have enabled runtime enhancement, but have not specified the set of persistent classes.  OpenJPA must look for metadata for every loaded class, which might increase class load times significantly.
23  SybaseUnit  WARN   [main] openjpa.Runtime - An error occurred while registering a ClassTransformer with PersistenceUnitInfo: name 'SybaseUnit', root URL [Service/target/classes/]. The error has been consumed. To see it, set your openjpa.Runtime log level to TRACE. Load-time class transformation will not be available.
30  SybaseUnit  WARN   [main] openjpa.Runtime - Could not create the optional validation provider. Reason returned: "A default ValidatorFactory could not be created."
2  MssqlUnit  INFO   [main] openjpa.Enhance - You have enabled runtime enhancement, but have not specified the set of persistent classes.  OpenJPA must look for metadata for every loaded class, which might increase class load times significantly.
1  MssqlUnit  WARN   [main] openjpa.Runtime - An error occurred while registering a ClassTransformer with PersistenceUnitInfo: name 'MssqlUnit', root URL [Service/target/classes/]. The error has been consumed. To see it, set your openjpa.Runtime log level to TRACE. Load-time class transformation will not be available.
2  MssqlUnit  WARN   [main] openjpa.Runtime - Could not create the optional validation provider. Reason returned: "A default ValidatorFactory could not be created."
[WARNING] 
    java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:543)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataAccessService': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected single matching bean but found 2: sybaseEntityManagerFactory,mssqlEntityManagerFactory
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:357)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1416)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
        at com.ge.hcit.xer.app.services.api.XERServiceMain.main(XERServiceMain.java:41)
        ... 6 more
    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected single matching bean but found 2: sybaseEntityManagerFactory,mssqlEntityManagerFactory
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:572)
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:531)
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:697)
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:670)
        at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354)
        ... 21 more

XML bean配置

代码语言:javascript
复制
<bean id="mssqlDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
        depends-on="localConfig">

    </bean>

    <bean id="mssqlTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="mssqlEntityManagerFactory" />

    </bean>


    <bean id="mssqlEntityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" primary ="true">
        <property name="dataSource" ref="mssqlDataSource" />
        <property name="jpaVendorAdapter" ref="openJpaVendorAdapter" />
        <property name="persistenceUnitName" value="MssqlUnit" />
        <property name="packagesToScan" >
            <list>
                <value>com.datasource.jpa.dto</value>
            </list>
        </property>
    </bean>

</beans>

<bean id="sybaseDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
        depends-on="localConfig">       
    </bean>

    <bean id="sybaseTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="sybaseEntityManagerFactory" />
         <property name="persistenceUnitName" value="SybaseUnit" />

    </bean>


    <bean id="sybaseEntityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="sybaseDataSource" />

    </bean>

还要在Spring boot主类中排除HibernateJpaAutoConfiguration.class,请参阅以下链接stackoverflow link

DataAccessService

代码语言:javascript
复制
@Repository

public class DataAccessService
{
    private static final Logger LOGGER = Logger.getLogger(DataAccessService.class);

    private static final String DEFAULT_HOSTNAME = "localhost";

    @PersistenceContext(unitName="MssqlUnit")
    private EntityManager entityManager;

如何在xml文件配置中执行相同的操作

如何在不删除xml bean的情况下将bean设置为"mssqlEntityManagerFactory“

代码语言:javascript
复制
1.add Primary ="true"
2.add unitName="MssqlUnit"
3.add Qualifer

但是仍然得到相同的错误

EN

回答 1

Stack Overflow用户

发布于 2019-09-25 16:30:20

Spring boot正在按类型解析依赖项,它正在为javax.persistence.EntityManagerFactory找到两个实现

  1. sybaseEntityManagerFactory
  2. mssqlEntityManagerFactory

您需要做的就是将其中一个bean设置为要使用的主bean

代码语言:javascript
复制
<bean primary="true|false"/>

如下所示

代码语言:javascript
复制
<bean id="mssqlEntityManagerFactory" primary="true" 
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="mssqlDataSource" />
        <property name="jpaVendorAdapter" ref="openJpaVendorAdapter" />
        <property name="persistenceUnitName" value="MssqlUnit" />
        <property name="packagesToScan" >
            <list>
                <value>com.datasource.jpa.dto</value>
            </list>
        </property>
    </bean>

或者您可以有条件地加载一个URL,此bean可能会对您有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58093897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档