저장소 기본 클래스를 스프링 부트 자동 구성에 등록하는 방법이 있습니까?
프로젝트에서 사용하는 몇 가지 추가 유틸리티 메서드가 포함된 기본 JPA 저장소 클래스가 있습니다.Spring Data JPA 설명서에 따라 클래스를 만들고 다음 예와 같이 구성 클래스에서 @EnableJpaRespositories 주석을 사용했습니다.
@Configuration
@EnableJpaRepositories(basePackageClasses = MyApplication.class,
repositoryBaseClass = MyJpaRepositoryImpl.class)
public class SpringDataJpaMyRepositoryConfiguration {
}
또한 basePackageClasses 특성을 설정하여 구성 클래스가 응용 프로그램 루트 패키지에 없으므로 리포지토리를 찾을 수 있도록 합니다.모든 것이 예상대로 작동하기 때문에 아직까지는 문제가 없습니다.
이제 추가 구성 없이 저장소 기본 클래스를 프로젝트에 추가할 스프링 부트 스타터를 만들고 싶지만 방법을 모르겠습니다.EnableJpaRespositoryBaseClass 특성을 설정하는 EnableJpaResposities 주석을 사용하여 AutoConfiguration 클래스를 생성하면 @SpringBootApplication 주석이 달린 클래스 아래의 리포지토리를 찾는 자동 리포지토리 검색 전략이 더 이상 작동하지 않습니다.
그리고 자동 구성을 사용하는 프로젝트의 메인 클래스나 패키지를 모르기 때문에 basePackageClasses 속성을 사용할 수 없습니다.
이것을 할 수 있는 방법이 있습니까?자동 구성에서 빈을 재정의하는 것이 어떨까요?
모든 Spring Data JPA 자동 구성을 다시 정의할 필요 없이 저장소 기본 클래스를 설정할 수 있는 방법이 가장 이상적입니다.
이 질문은 그 당시 저를 미치게 만들었기 때문에 제가 이 문제에 대해 당신을 도울 수 있다고 생각했습니다.
기본적으로 다음을 목표로 합니다.
- JPA 구성에 대한 구성 클래스 만들기
- basePackageClass와 동일한 구성 클래스를 참조하는 @EntityScan 및 @EnableJpaRepository 추가
- 자동 구성에서 이 구성 클래스 가져오기
- 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())));
};
}
}
이것이 당신이 머리를 긁는 순간들을 통과하는 데 도움이 되기를 바랍니다 :-)
편집: 답변을 거의 다시 작성했습니다. - 원래 질문을 잘못 이해했습니다.
좋은 해결책은 을 볼 수 은 내부에서 입니다.@EnableJpaRepositories
.
자동 하여 그면자구이여사하있수다용습니할을 할 수 있습니다.@ConditionalOnProperty
됩니다.
@Configuration
@ConditionalOnProperty("repositories-base-packages")
public class BaseRepositoryAutoConfiguration {
@Configuration
@EnableJpaRepositories(
repositoryBaseClass = MyJpaRepositoryImpl.class,
basePackages = "${repositories-base-packages}"
)
public static class JpaRepositoriesConfig { }
}
그럼 당신이 가지고 있는 것을 확인하세요.application.properties
또는application.yml
은 는것하은을 합니다.repositories-base-packages
응용프로그램 내부에 있습니다.
여러 개의 기본 패키지를 어떻게 선언할지 확신할 수 없습니다. 제 SpEL 지식은 원시적이기 때문에 가능할지조차 모르겠습니다.
언급URL : https://stackoverflow.com/questions/42133023/is-there-a-way-to-register-a-repository-base-class-with-a-spring-boot-auto-confi
'programing' 카테고리의 다른 글
Ruby 1.9.2가 LOAD_PATH에서 "."를 제거하는 이유는 무엇이며, 그 대안은 무엇입니까? (0) | 2023.07.05 |
---|---|
SQL Server 데이터베이스에서 스크립트를 사용하여 기본 키 삭제 (0) | 2023.07.05 |
Node.js에서 데이터베이스 관련 경합 조건 방지 (0) | 2023.07.05 |
키보드를 제거하는 쉬운 방법? (0) | 2023.07.05 |
Python 3에서는 부동소수점 값 4*0.1이 좋아 보이지만 3*0.1은 그렇지 않은 이유는 무엇입니까? (0) | 2023.07.05 |