我正在开始一个基于的项目 Stephan Zerhusen's excellent SpringBoot + JWT演示。它在我的SpringToolSuite项目中安装并运行良好。我的进一步发展遇到了问题。
我想将Stephan的代码(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的内容融合在一起? - 但是我的配置没有让我的程序运行。
有人可以根据我的情况给我一个正确的配置吗?
谢谢, 杰罗姆。
更新时间为7月30日,12:04 CDT 使用注释我只使用类更改了@EnableJpaRepositories语句。通过该更改,应用程序可以正常运行。
考虑到这一点,我尝试了变体,一次注释掉一个注释:
我会取得这样的成功(感谢所有响应者提供了一个有效的应用程序),但还不明白为什么需要这四个注释。
答案 0 :(得分:3)
问题在于您的@EnableJpaRepositories
- 您指定了类名而不是包名。只需完全删除参数(事实上,您应该能够消除除@SpringBootApplication
- @ComponentScan
之外的所有内容。)
作为一项规则,Boot的默认设置是一个很好的通用折衷方案,因此除非您与默认设置发生实际冲突,否则不要明确指定内容。
答案 1 :(得分:2)
在您的@EnableJpaRepositories
中,如果您希望保留basePackagesClass
,则可以使用basePackages
代替org.zerhusen.security.repository
或设置basePackages
。