![](/img/trans.png)
[英]@ComponentScan doesn't work in Spring boot AutoConfiguration class?
[英]Spring Boot — why doesn't the @ComponentScan work with my package combination?
我正在基于Stephan Zerhusen出色的SpringBoot + JWT演示启动一个项目。 它可以在我的SpringToolSuite项目中安装并正常运行。 我对此的进一步开发遇到了问题。
我想将斯蒂芬的代码(org.zerhusen)与我的业务逻辑(com.mypackage)分开。 我尝试过的@SpringBootApplication和@ComponentScan的配置对我来说都没有用。
SpringBoot启动程序是:
package org.zerhusen;
[SNIP]
@SpringBootApplication
public class JwtDemoApplication {
public static void main(String[] args) {
SpringApplication.run(JwtDemoApplication.class, args);
}
}
如果仅将软件包从org.zerhusen更改为com.mypackage并再次运行该程序,我会看到:
APPLICATION FAILED TO START
***************************
Description:
Field userRepository in org.zerhusen.security.service.JwtUserDetailsServiceImpl required a bean of type 'org.zerhusen.security.repository.UserRepository' that could not be found.
Action:
Consider defining a bean of type 'org.zerhusen.security.repository.UserRepository' in your configuration.
现在UserRepository只是一个接口:
package org.zerhusen.security.repository;
[SNIP]
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
但是该接口不是由用户代码实现的。 并且由于此时我仅使用H2(稍后将使用JPA和MySQL),因此该接口仅在UserDetailsService实现的实现中被引用:
package org.zerhusen.security.service;
[SNIP]
@Service
public class JwtUserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
[SNIP]
}
有很多stackoverflow文章告诉我使用配置,但是我已经有:
@SpringBootApplication(scanBasePackages = {"org.zerhusen"})
@ComponentScan(basePackages = {"org.zerhusen"})
@EnableJpaRepositories(basePackages = {"org.zerhusen.security.repository.UserRepository"})
@EntityScan(basePackages = {"org.zerhusen"})
public class JwtDemoApplication {
[SNIP]
}
而且这些都不适合我。
我不想将所有内容强加到单个程序包树中-如何在不重写Stephan's的情况下将代码与Stephan's融合? -但是我的配置无法使我的程序运行。
有人可以根据我的情况给我正确的配置吗?
谢谢杰罗姆。
CDT 7 / 30,12: 04更新。使用注释,我仅使用类更改了@EnableJpaRepositories语句。 进行此更改后,应用程序将正常运行。
考虑到这一点,我尝试了变体,一次注释了一个注释:
我会取得成功(感谢所有响应者的支持,可正常运行的应用程序),但尚不明白为什么需要这四个注释。
问题出在您的@EnableJpaRepositories
中-您指定了类名而不是包名 。 只需完全删除参数(实际上,您应该能够消除除@SpringBootApplication
所有内容, @SpringBootApplication
包括@ComponentScan
)。
通常,Boot的默认值是一个很好的通用折衷方案,因此,除非您与默认值发生实际冲突,否则不要开始明确指定内容。
在您的@EnableJpaRepositories
,可以使用basePackagesClass
而不是basePackages
或设置org.zerhusen.security.repository
如果您希望保留basePackages
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.