Java 如何在众多JAR之间分离Spring JPA配置?

Java 如何在众多JAR之间分离Spring JPA配置?,java,spring,configuration,Java,Spring,Configuration,我有一个用例,我需要将我的Spring配置分为两个完全独立的应用程序 应用程序#1将包含具有Hibernate映射的DAO模型、JPA存储库、DTO模型以及从DAO转换为DTO的逻辑 应用程序#2将包含包含所有业务逻辑的RESTful控制器和服务类 应用程序#1配置: // For application startup package com.appone.pkg.one @SpringBootApplication public class Application { publi

我有一个用例,我需要将我的Spring配置分为两个完全独立的应用程序

应用程序#1将包含具有Hibernate映射的DAO模型、JPA存储库、DTO模型以及从DAO转换为DTO的逻辑

应用程序#2将包含包含所有业务逻辑的RESTful控制器和服务类


应用程序#1配置:

// For application startup
package com.appone.pkg.one

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// For global configuration files across numerous projects
package com.appone.pkg.two

@Configuration
public class GlobalAppConfig {

    @Bean
    MapperFacade mapperFacade() {
        MapperFactory factory = new DefaultMapperFactory.Builder().build();

        factory.classMap(Group.class, GroupDTO.class).byDefault().register();
        factory.classMap(Role.class, RoleDTO.class).byDefault().register();
        factory.classMap(User.class, UserDTO.class).byDefault().register();

        return factory.getMapperFacade();
    }
 }

// For configuration aspects important for 1 project in particular
package com.appone.pkg.three

@Configuration
@EnableJpaRepositories("com.pkg.three.jpa.repository")
public class AppTwoConfig {

    @Autowired
    private EntityManager em;
    private RepositoryFactorySupport factorySupport;

    private void initialize(){
        if(factorySupport == null){
            factorySupport = new JpaRepositoryFactory(em);
        }
    }

    @Bean
    GroupRepository groupRepository(){
        initialize();
        return factorySupport.getRepository(GroupRepository.class);
    }
    @Bean
    RoleRepository roleRepository(){
        initialize();
        return factorySupport.getRepository(RoleRepository.class);
    }
    @Bean
    UserRepository userRepository(){
        initialize();
        return factorySupport.getRepository(UserRepository.class);
    }
    @Bean
    GroupValidator groupValidator(){
        return new GroupValidator();
    }
    @Bean
    UserValidator userValidator(){
        return new UserValidator();
    }
    @Bean
    ResourceMapper resourceMapper(){
        return new ResourceMapper();
    }
}
package com.apptwo.pkg.one;

@SpringBootApplication
@EnableAutoConfiguration
@EntityScan(basePackageClasses = {com.appone.pkg.three.AppTwoConfig.class})
public class ApplicationTwo {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationTwo.class, args);
    }
}
应用程序#2配置:

// For application startup
package com.appone.pkg.one

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// For global configuration files across numerous projects
package com.appone.pkg.two

@Configuration
public class GlobalAppConfig {

    @Bean
    MapperFacade mapperFacade() {
        MapperFactory factory = new DefaultMapperFactory.Builder().build();

        factory.classMap(Group.class, GroupDTO.class).byDefault().register();
        factory.classMap(Role.class, RoleDTO.class).byDefault().register();
        factory.classMap(User.class, UserDTO.class).byDefault().register();

        return factory.getMapperFacade();
    }
 }

// For configuration aspects important for 1 project in particular
package com.appone.pkg.three

@Configuration
@EnableJpaRepositories("com.pkg.three.jpa.repository")
public class AppTwoConfig {

    @Autowired
    private EntityManager em;
    private RepositoryFactorySupport factorySupport;

    private void initialize(){
        if(factorySupport == null){
            factorySupport = new JpaRepositoryFactory(em);
        }
    }

    @Bean
    GroupRepository groupRepository(){
        initialize();
        return factorySupport.getRepository(GroupRepository.class);
    }
    @Bean
    RoleRepository roleRepository(){
        initialize();
        return factorySupport.getRepository(RoleRepository.class);
    }
    @Bean
    UserRepository userRepository(){
        initialize();
        return factorySupport.getRepository(UserRepository.class);
    }
    @Bean
    GroupValidator groupValidator(){
        return new GroupValidator();
    }
    @Bean
    UserValidator userValidator(){
        return new UserValidator();
    }
    @Bean
    ResourceMapper resourceMapper(){
        return new ResourceMapper();
    }
}
package com.apptwo.pkg.one;

@SpringBootApplication
@EnableAutoConfiguration
@EntityScan(basePackageClasses = {com.appone.pkg.three.AppTwoConfig.class})
public class ApplicationTwo {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationTwo.class, args);
    }
}
应用程序#2数据加载:

package com.apptwo.pkg.two;

@Component
public class DataLoader implements ApplicationRunner {

    @Autowired
    private GroupRepository groupRepository;
    @Autowired
    private RoleRepository roleRepository;
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private ResourceMapper resourceMapper;

    /**
     * Loads initial data into the h2 database.
     */
    public void run(ApplicationArguments args) {
        // Load the initial data ... 
    }
}
这是我尝试启动应用程序2时遇到的例外情况。应用程序#1本身启动良好,但我没有使用那里的存储库,并且相信如果我尝试,它可能会抛出错误。不过,我最终只希望在应用程序2中使用逻辑。你知道我做错了什么吗

我需要初始化应用程序#1配置中的所有依赖项,然后在运行应用程序#2配置之前从应用程序#2内部运行该配置

说明: com.apptwo.pkg.two.DataLoader中的字段groupRepository需要类型为的bean 找不到“com.appone.pkg.three.jpa.repository.GroupRepository”

行动: 考虑定义一个类型为“COM.AppOn.pk..jp.RealSty.CyberPosiPosik”的bean。 您的配置


组件扫描仅扫描
com.apptwo.pkg.one的子包
。您必须在
@SpringBootApplication

@SpringBootApplication(basePackages ={"com.appone", "com.apptwo"})

多亏了这么多人,我找到了一个解决办法

部分帮助来自此帖子:

第1步:

已从应用程序#1中删除Application.class,因此它不能作为独立的Spring Boot应用程序运行

第2步:

我像这样更改了AppTwoConfig.java

// For configuration aspects important for 1 project in particular
package com.appone.pkg.three

@Configuration
@EnableJpaRepositories("com.pkg.three.jpa.repository")
@EntityScan("com.pkg.three.jpa.model")
public class AppTwoConfig {

    @Bean
    GroupValidator groupValidator(){
        return new GroupValidator();
    }
    @Bean
    UserValidator userValidator(){
        return new UserValidator();
    }
    @Bean
    ResourceMapper resourceMapper(){
       return new ResourceMapper();
    }
}
第三步:

我更改了应用程序#2内部的Application.java,该应用程序应作为Spring Boot应用程序运行

package com.apptwo.pkg.one;

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = {
        com.apptwo.pkg.one.config.AppConfig.class,
        com.appone.pkg.two.GlobalAppConfig.class,
        com.appone.pkg.three.AppTwoConfig.class
})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

您不应该在另一个spring boot应用程序中包含spring boot应用程序。我怀疑app1是否需要是一个spring boot应用程序,而应该是一个普通的jar文件。如果不是spring boot,我还能使用spring JPA存储库、Autowired和所有其他有趣的东西吗?为什么不能呢。app1不是一个应用程序,只是一个有依赖关系的jar。哦,我想我把它复杂化了,让一切都在Spring引导下。当我有机会的时候,我会尝试将AppOne转换成标准的Maven应用程序,看看是否可以修复它。谢谢你的快速回复。