WebMvcAutoConfiguration与多个外部EntityManager

时间:2018-05-22 13:15:35

标签: java spring spring-mvc spring-boot spring-data-jpa

我在将现有的Spring Web应用程序迁移到Spring Boot 1.5.13的过程中遇到了问题。我几乎处理了所有事情,但我无法设法将好的持久性单元注入WebMvcAutoConfiguration。我实际上有3个不同的实体管理器工厂从类路径导入(由3个不同的内部库提供为.xml文件,我无法更改它们)。它们中的每一个都以这种方式分裂:

<sqe-db:jpa-emf database-definition-name="db-name" embedded-datasource="false"/>

<bean id="transaction-mnanager-name" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="jpa-lib-name" />
    </bean>

目前,tomcat提供了数据源配置,但是我将它们外部化为dev环境的application.properties

迁移后,我没有找到任何方法为WebMvcAutoConfiguration指定正确的bean,这导致以下错误:

Method requestMappingHandlerMapping in org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration required a single bean, but 3 were found:
    - jpa-lib1-name1: defined in null
    - jpa-lib1-name2: defined in null
    - jpa-lib1-name3: defined in null

此时我的目标是实施以下配置:

  • 让应用程序既可以作为SpringApplication运行,又可以作为WAR部署(我想我已经做好了)
  • 有一种方法可以为Web应用程序使用Spring Boot自动配置,即使在类路径中有多个实体工厂
  • 将我自己的数据源用于“dev”配置文件,但将tomcat保留为其他环境。

我的要求是,或多或少:   - 尽量减少现有应用程序所需的更改   - 继续使用库提供的.xml

一个简单的选择是使用更现代的注释驱动配置重写配置,但我更愿意坚持现有的实现,这样我就不必在发布新库时更改它。 / p>

如何在不触及现有xml文件的情况下声明@Primary bean?

非常欢迎任何想法或不同的方法

1 个答案:

答案 0 :(得分:0)

经过一夜好眠,我找到了最简单的解决方案。

我将此添加到我的配置类:

@Autowired
@Qualifier("name-of-default-factory")
private EntityManagerFactory entityManagerFactory;

@Bean
@Primary
public EntityManagerFactory getEntityManagerFactory() {
    return entityManagerFactory;
}

现在它将正确注入主bean。