使用JavaConfig我在查找@Repository
Spring bean时遇到问题。
存储库接口的定义如下:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
配置定义如下:
@Configuration
@ComponentScan("com.example")
@EnableAutoConfiguration
@EnableJpaRepositories("com.example")
public class SampleApplication extends SpringBootServletInitializer {
...
包结构如下所示:
com.example
configuration
SampleApplication
repository
UserRepository
在日志文件中,我看到存储库找到作为bean定义的候选者,但是:
ClassPathBeanDefinitionScanner | Ignored because not a concrete top-level class:
有趣的事实
如果我将SampleApplication类移动到com.example
包,一切都会开始工作。
我缺少什么想法?
答案 0 :(得分:11)
如果您的JPA实体不在@EntityScan
的子包中,则可能需要使用Spring Boot的com.example.configuration
注释。我还建议您将@Configuration
移出SpringBootServletInitializer
并进入自己的班级。
如果您可以将配置类上移到某个级别,则可以将@ComponentScan
,@EnableJpaRepositories
和@EntityScan
注释全部放在一起(请参阅http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-locating-the-main-class)
如果@EntityScan
无法解决问题,或许您可以提供一个我们可以查看的示例项目?
答案 1 :(得分:2)
当开始检查@EnableJpaRepositories("com.example")
作为基础包时,问题听到使用com.example
您的上下文但它不会继续。换句话说,包扫描将在com.example
级别停止。为了更深层次的准备,你必须做这样的事情@EnableJpaRepositories("com.example.**")
。但是在这种情况下,Spring数据会检查所有包com.example
和所有子包。一个更正确的approch应该像这样@EnableJpaRepositories("com.example.repository")
或@EnableJpaRepositories("com.example.repository.**")
。在第一种情况下,您扫描存储库基本包,在第二种情况下,您扫描存储库和存储库的所有子包,在我看来是这种情况下的正确approch。
我希望这可以帮到你
答案 2 :(得分:0)
我通常认为您在@EnableJpaRepositories中指定的包也会遍历内部包。
如果有疑问,您可以尝试使用类型安全替代方案:
@Configuration
@ComponentScan("com.example")
@EnableAutoConfiguration
@EnableJpaRepositories (basePackageClasses = {UserRepository.class})
public class SampleApplication extends SpringBootServletInitializer {
...
答案 3 :(得分:0)
@EnableJpaRepositories (basePackageClasses = {SchedulerRepository.class})
在我的情况下为我工作,尽管我添加了所有注释以选择存储库