添加 @ComponentScan 以从 jar 加载 bean 后,我的控制器未扫描,我得到 404

After adding @ComponentScan to load beans from a jar my controllers isn't scan and i get 404

我有一个 spring-boot 应用程序(Java8,spring-boot 2.1.4-RELEASE)。

业务层中的一项服务需要从我的 class 路径中的某个 jar 中 @Autowire 一个 bean。为了实现这一点,我必须添加 @ComponentScan({"package.to.my.bean.inside.the.jar"}) 并且它被神奇地扫描并成功连接(这被添加到 main spring-boot class 声明主要方法)。

但是,从那以后我的控制器没有被扫描,因此 DispatcherServlet 为我触发的每个请求返回 404(默认调度程序)。 实际上我的整个 spring-boot app 注释都被忽略了——没有执行扫描。 只是强调 - 在添加 @ComponentScan 之前应用程序运行完美。

主spring-启动应用程序class:

package com.liav.ezer;

// This is the problematic addition that cause the endpoints to stop
// inside a jar in the classpath, in com.internal.jar package resides an 
// object which i need to wire at run time
@ComponentScan({"com.internal.jar"})
@SpringBootApplication
public class JobsApplication {
    public static void main(String[] args) {
        SpringApplication.run(JobsApplication .class, args);
        }
}

控制器示例:

package com.liav.ezer.controller;

@RestController
@EnableAutoConfiguration
@RequestMapping(path = "/jobs")
public class JobController {

    @GetMapping(path="/create", produces = "application/json")
    @ResponseStatus(HttpStatus.OK)
    String createJob(@RequestParam() String jobName) String jobName){       
        return "job created...";
    }
}

我尝试将我的 spring-boot 应用程序基础包添加到 @ComponentScan 的包列表中,但没有成功。 我尝试将包声明的范围缩小到只在我需要的 class 上,但没有运气。 这是代码

如果是这样,去掉@ComponentScan,可以在自己的配置中声明那个bean。 试试下面

@SpringBootApplication
public class JobsApplication {
    public static void main(String[] args) {
        SpringApplication.run(JobsApplication .class, args);
        }
     @Bean
     public BeanInOtherJar xxBean(){
        return new com.internal.jar.XXX();
     }
}

根据Spring documentation

Configures component scanning directives for use with @Configuration classes. Provides support parallel with Spring XML's element. Either basePackageClasses() or basePackages() (or its alias value()) may be specified to define specific packages to scan. If specific packages are not defined, scanning will occur from the package of the class that declares this annotation.

在您添加

的情况下

@ComponentScan({"com.internal.jar"}) you are disabling scanning of com.liav.ezer.controller

要修复它,您可以进行以下配置

@ComponentScan(basePackages = {"com.internal.jar", "com.liav.ezer.controller"})