我有一个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中的软件包列表中,但是没有运气。 我试图缩小包声明的范围,使其仅适用于我需要的类,但是没有运气。 这是代码
答案 0 :(得分:1)
配置组件扫描指令以与@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
}));