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

时间:2019-05-31 19:06:25

标签: java spring spring-boot component-scan

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

业务层中的一项服务需要@Autowire我的类路径中的某些jar中的bean。为了实现这一点,我必须添加@ComponentScan({“ package.to.my.bean.inside.the.jar”}),并对其进行了神奇的扫描并成功进行了连接(这已添加到主spring-boot类中,该类声明主要方法)。

但是,自那时以来,未扫描我的控制器,因此DispatcherServlet为我触发的每个请求(默认调度程序)都返回404。 实际上,我的整个spring-boot应用程序注释都将被忽略-不执行扫描。 只是要强调-在添加@ComponentScan之前,该应用程序运行良好。

主要的spring-boot应用程序类:

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中的软件包列表中,但是没有运气。 我试图缩小包声明的范围,使其仅适用于我需要的类,但是没有运气。 这是代码

2 个答案:

答案 0 :(得分:1)

根据Spring documentation

  

配置组件扫描指令以与@Configuration一起使用   类。提供与Spring XML并行的支持    元件。 basePackageClasses()或   可以指定basePackages()(或其别名value())来定义   要扫描的特定软件包。如果未定义特定的程序包,   扫描将从声明此内容的类的包中进行   注释。

在您添加

  

@ComponentScan({“ com.internal.jar”})   您正在禁用扫描   com.liav.ezer.controller

要解决此问题,您可以进行以下配置

  

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

答案 1 :(得分:0)

如果是这样,请删除@ComponentScan,可以在自己的配置中声明该bean。 尝试以下

router.get('/user/signup', (req, res, next) => {
  let messages = req.flash('error');
  res.render('user/signup', { csrfToken: req.csrfToken(), messages: messages, hasErrors: messages.length > 0 });
});

router.post('/user/signup', passport.authenticate('local-signup', {
  succesRedirect: '/user/profile',
  failureRedirect: '/user/signup',
  failureFlash: true
}));