Spring Boot - 为什么@ComponentScan不能与我的包组合一起使用?

时间:2017-07-30 01:47:57

标签: java spring-boot

我正在开始一个基于的项目  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),接口仅在UserDetailsS​​ervice实现的实现中被引用:

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语句。通过该更改,应用程序可以正常运行。

考虑到这一点,我尝试了变体,一次注释掉一个注释:

  • 如果没有@SpringBootApplication,则Spring Boot容器无法启动。
  • 如果没有@ComponentScan,应用程序将启动。它有一个用户名/密码弹出窗口,如基本身份验证,但实际上并不起作用。
  • 没有@EnableJpaRepositories我被问及UserRepository
  • 没有@EntityScan Spring Boot将无法启动Tomcat。

我会取得这样的成功(感谢所有响应者提供了一个有效的应用程序),但还不明白为什么需要这四个注释。

2 个答案:

答案 0 :(得分:3)

问题在于您的@EnableJpaRepositories - 您指定了类名而不是包名。只需完全删除参数(事实上,您应该能够消除除@SpringBootApplication - @ComponentScan之外的所有内容。)

作为一项规则,Boot的默认设置是一个很好的通用折衷方案,因此除非您与默认设置发生实际冲突,否则不要明确指定内容。

答案 1 :(得分:2)

在您的@EnableJpaRepositories中,如果您希望保留basePackagesClass,则可以使用basePackages代替org.zerhusen.security.repository或设置basePackages