“Spring嵌套应用程序上下文”;没有名为'的bean;实体管理工厂&x27;定义为;

“Spring嵌套应用程序上下文”;没有名为'的bean;实体管理工厂&x27;定义为;,spring,spring-boot,spring-data,Spring,Spring Boot,Spring Data,我需要在spring boot应用程序中的一个独立应用程序上下文中导出一组JPA positionories,然后将我需要的服务从独立应用程序上下文提取并发布到全局上下文中 配置类如下所示: @Configuration @Import({PersistenceAutoConfiguration.class, DaoServicesConfiguration.class}) public class TestApiAutoconfiguration implements Initializing

我需要在spring boot应用程序中的一个独立应用程序上下文中导出一组JPA positionories,然后将我需要的服务从独立应用程序上下文提取并发布到全局上下文中

配置类如下所示:

@Configuration
@Import({PersistenceAutoConfiguration.class, DaoServicesConfiguration.class})
public class TestApiAutoconfiguration implements InitializingBean {
    private AnnotationConfigApplicationContext myApplicationContext;

    @Autowired
    LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory;

    @Autowired
    ConfigService configService;

    @Autowired
    FeatureService featureService;

    @Override
    public void afterPropertiesSet() throws Exception {
        myApplicationContext = new AnnotationConfigApplicationContext();

        myApplicationContext.getBeanFactory().registerSingleton("entityManagerFactory", primaryEntityManagerFactory.getObject());
        myApplicationContext.getBeanFactory().registerSingleton("configService", configService);
        myApplicationContext.getBeanFactory().registerSingleton("featureService", featureService);

        myApplicationContext.register(TestApiConfiguration.class);
        myApplicationContext.refresh();
    }

    @Bean(name = "/TestApi.json")
    JsonServiceExporter jsonServiceExporter() {
        TestApi testApi = myApplicationContext.getBean(TestApi.class);
        CustomObjectMapper customObjectMapper =    
            myApplicationContext.getBean(CustomObjectMapper.class);

        JsonServiceExporter jsonServiceExporter = new JsonServiceExporter();
        jsonServiceExporter.setService(testApi);
        jsonServiceExporter.setServiceInterface(TestApi.class);
        jsonServiceExporter.setObjectMapper(customObjectMapper);

        return jsonServiceExporter;
    }
}
我得到以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanNameHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.payliquid.autoconfigure.TestApiAutoconfiguration': Invocation of init method failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
我显式地发布了entityManagerFactory,为什么会出现此异常


其次,为什么在
WebMvcAutoConfiguration
类中提到异常跟踪

以下解决方案是一种变通方法。如果您知道更好的实现方法,请发布答案


根据一些关于
entityManagerFactory
bean的生命周期问题的挖掘,bean在spring数据的编程配置中非常常见

我在执行标准spring引导时也遇到了这个问题,需要应用以下模式来获得正确的生命周期顺序

@Configuration
@EnableJpaRepositories(...)
class AConfigurationClass {
   @Bean 
   EntityManagerFactory entityManagerFactory() {
       //..
   }
}
为了符合这种模式,我决定手动将字段作为静态变量注入——即


您正在注册单例,然后执行刷新,该刷新将销毁当前bean并重新创建上下文。为什么不简单地将当前上下文添加为父上下文,而不是尝试解决它…看起来也像一个奇怪的装置,它只会使事情复杂化,并可能导致有趣的生命周期问题。。。一个bean现在突然成为了多个上下文的一部分……如果我使用刷新的方式不正确,我该如何实现上面的模式?子上下文有一个bean,该bean迭代已注册的存储库bean并从中组合出另一个bean。如果我设置了父项,我将不得不从父项中筛选出存储库。不,你没有。您只需在上下文中使用适当的方法从子对象中查找存储库。
refresh()
调用不会销毁已注册的单例,因为我可以在调用后检索它们。
@Configuration
@EnableJpaRepositories(basePackageClasses = {AcquirerDAO.class})
public class TestApiConfiguration {
    private static EntityManagerFactory entityManagerFactory;
    private static DataSource datasource;

    public static void setEntityManagerFactory(EntityManagerFactory emf) {
        entityManagerFactory = emf;
    }

    public static void setDatasource(DataSource ds) {
        datasource = ds;
    }

    @Bean
    EntityManagerFactory entityManagerFactory() {
        return entityManagerFactory;
    }

    @Bean
    DataSource dataSource() {
        return datasource;
    }
 //...
}