繁体   English   中英

Spring Boot —为什么@ComponentScan无法与我的软件包组合一起使用?

[英]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),因此该接口仅在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's的情况下将代码与Stephan's融合? -但是我的配置无法使我的程序运行。

有人可以根据我的情况给我正确的配置吗?

谢谢杰罗姆。

CDT 7 / 30,12: 04更新。使用注释,我仅使用类更改了@EnableJpaRepositories语句。 进行此更改后,应用程序将正常运行。

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

  • 没有@SpringBootApplication,Spring Boot容器将无法启动。
  • 没有@ComponentScan,应用程序将启动。 它具有类似于基本身份验证的用户名/密码弹出窗口,但实际上不起作用。
  • 如果没有@EnableJpaRepositories,则会询问有关UserRepository的信息
  • 没有@ EntityScan,Spring Boot不会启动Tomcat。

我会取得成功(感谢所有响应者的支持,可正常运行的应用程序),但尚不明白为什么需要这四个注释。

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

通常,Boot的默认值是一个很好的通用折衷方案,因此,除非您与默认值发生实际冲突,否则不要开始明确指定内容。

在您的@EnableJpaRepositories ,可以使用basePackagesClass而不是basePackages或设置org.zerhusen.security.repository如果您希望保留basePackages

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM