gpt4 book ai didi

java - 有没有办法用 spring boot 自动配置注册一个存储库基类?

转载 作者:太空狗 更新时间:2023-10-29 22:58:13 24 4
gpt4 key购买 nike

我们有一个基本的 JPA 存储库类,其中包含我们在项目中使用的一些其他实用方法。关注Spring Data JPA documentation我们创建了类并在配置类中使用@EnableJpaRepositories 注释,如下例所示:

@Configuration
@EnableJpaRepositories(basePackageClasses = MyApplication.class,
repositoryBaseClass = MyJpaRepositoryImpl.class)
public class SpringDataJpaMyRepositoryConfiguration {
}

我们还设置了 basePackageClasses 属性以便找到我们的存储库,因为配置类不在应用程序根包中。一切都按预期工作,所以到目前为止没有问题。

现在我们想创建一个spring boot starter来将存储库基类添加到我们的项目中而无需进一步配置,但我们不知道如何去做。如果我们使用 EnableJpaRepositories 注释设置 repositoryBaseClass 属性创建一个 AutoConfiguration 类,自动存储库查找策略会在用 @SpringBootApplication 不再工作了。

而且我们不能使用 basePackageClasses 属性,因为我们不知道使用自动配置的项目的主类或包。

有什么办法吗?也许通过在我们的自动配置中重新定义一些 bean?

理想的方法是允许设置存储库基类,而无需再次定义所有 Spring Data JPA 自动配置。

最佳答案

这个问题当时把我逼疯了,所以我想我可以帮你解决这个问题。

基本上,这个想法是:

  • 为您的 Jpa 配置创建一个配置类
  • 添加@EntityScan 和@EnableJpaRepositories 引用与basePackageClass 相同的配置类
  • 在你的自动配置中导入这个配置类
  • 创建一个注解,然后您可以在需要 Jpa 配置的地方重用该注解

在您的示例中,您使用 Spring 应用程序类作为扫描的基础。

我已经在 https://github.com/rdlopes/custom-jpa-demo 上发布了一个示例项目来 POC 主要思想。

在示例中,有一个用于公开 JPA 配置的 JPA 实体/存储库的项目:

   @Configuration
@EntityScan(basePackageClasses = JpaConfiguration.class)
@EnableJpaRepositories(basePackageClasses = JpaConfiguration.class,
repositoryBaseClass = BaseRepositoryImpl.class)
public class JpaConfiguration {

}

注意存储库的通用实现,您需要显示一个特殊的签名:

@NoRepositoryBean
public class BaseRepositoryImpl<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements BaseRepository<T, ID> {

public BaseRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}

@Override
public String someCustomMethod(ID id) {
return "Class for entity of id " + id + " is: " + getDomainClass().getSimpleName();
}
}

然后您可以这样创建您的自动配置:

@Configuration
@ConditionalOnClass(CustomJpaRepositories.class)
@Import(JpaConfiguration.class)
public class JpaCustomAutoConfiguration {

}

提供注释以保持整洁并在需要 JPA 的地方使用它:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CustomJpaRepositories {
}

使用 JPA 类就像在调用 JPA 存储库的地方添加此注释一样简单:

@SpringBootApplication
@CustomJpaRepositories
public class CustomJpaSampleApplication {

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

@Bean
public CommandLineRunner dataInitializer(UserRepository userRepository) {
return args -> {
User user1 = new User();
user1.setName("user 1");
userRepository.save(user1);

User user2 = new User();
user2.setName("user 2");
userRepository.save(user2);

userRepository.findAll()
.forEach(user -> System.out.println(
userRepository.someCustomMethod(user.getId())));
};
}
}

希望这可以帮助您度过头痛的时刻:-)

关于java - 有没有办法用 spring boot 自动配置注册一个存储库基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42133023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com