当前位置: 首页 > 知识库问答 >
问题:

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

魏君博
2023-03-14

我正在启动一个基于Stephan Zerhusen出色的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更改包。泽胡森去通讯。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的代码的情况下将我的代码与Stephan的代码融合?——但我的配置无法让我的程序运行。

有人能给我一个正确的配置吗?

谢谢,杰罗姆。

UPDATE ON7/30, 12:04CDT使用注释,我只使用类更改了@EnableJpaRepository语句。有了这个变化,应用程序可以正常工作。

考虑到这一点,我尝试了各种变化,一次评论一个注释:

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

我将接受这一成功(感谢所有响应者的一个工作应用程序),但我还不明白为什么需要这四个注释。

共有2个答案

葛昕
2023-03-14

@EnableJpaRepositories中,可以使用basePackageClass而不是basePackages或设置org。泽胡森。安全存储库如果您希望保留基本包

朱建弼
2023-03-14

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

一般来说,Boot的默认值是一个很好的通用折衷方案,所以不要开始显式地指定东西,除非您与默认值有实际冲突。

 类似资料:
  • 问题内容: 这是用例: 然后,我正在做: 这是我看到的: 我的书在哪里?:) 问题答案: 要编组的元素必须是公共的,或具有XMLElement注释。ArrayList类和您的类Books不符合任何这些规则。您必须定义一种方法来提供Book值并对其进行注释。 在您的代码上,仅更改您的Books类,并添加“ self getter”方法: 当您运行编组代码时,您将获得: (为清晰起见,我添加了换行符)

  • 当在嵌入了tomcat的spring boot中运行代码时,Spring cloud consul可以像预期的那样工作。 当我们在独立的tomcat上部署代码时,它不起作用。似乎有一个Web服务器上启动领事服务注册。仅当我们在带有嵌入式 tomcat 的Spring启动内运行代码时,才会触发此事件。 https://github.com/spring-cloud/spring-cloud-cons

  • 我在试着为Spock中的控制器写一个测试。 应用程序类只是Spring Boot最简单的配置(支持自动扫描)。它提供了一个with PasswordEncryptor。我想用提供模拟的bean替换应用程序中的这个bean。 没有注释,所以Spring不知道应该注入哪个bean。不幸的是,我不知道如何让Spring通过本地配置从应用程序中替换bean。

  • 我正在尝试使用龙目岛和MapStruct配置SpringBoot(v2.6.2),已经配置了maven编译器插件和龙目岛地图结构绑定(注释处理器路径),但龙目岛类尚未创建: pom.xml 尝试使用DI时总是出现未初始化变量错误: 变量xxxx可能尚未初始化

  • 我正在使用karaf 3.0.3和以下Hibernate捆绑包: 161|活动|80|;4.2.12.Final|hibernate core 162124活动#80 1244.1.12.Final124Hibernate entitymanager 172| 124活动80#4.2-12.fin 通过这种设置,我无法让事务回滚正常工作,尽管我可以将完全相同的组件(JPA DAO、服务层等)部署为

  • css在中不工作,但使用此css代码。我在css区域和html标记中首先编写,然后编写。为什么? CSS HTML