我正在重构现有应用程序以使用 Spring Boot。我在这里遇到的问题通常是“为什么这不再起作用”类型。
我有三个包裹 - nl.myproject.boot - nl.myproject - nl.myproject.rest
我当前的问题是,当对它们调用方法时,@Service
中的
@Inject
解析为null。
该服务和 dao 是 nl.myproject 包的一部分,它不是 nl.myproject.core 的原因是一个遗留问题。 一个相关的问题是我的@Configuration组件似乎没有通过
@RESTController
加载,我必须手动导入它们。我还必须排除测试配置以防止加载测试配置,这看起来也很奇怪。
启动时服务层内部调用,如数据准备工作正常。任何这样的经理也会被
@ComponentScan
ed。这只是说任何典型的注入错误(例如手动实例化或注入类而不是接口)都不适用。
我也很感激您提供调试技巧。我的 Java 有点生锈了。
@Inject
@EnableAutoConfiguration
@ComponentScan(basePackages= {
"nl.myproject",
"nl.myproject.boot",
"nl.myproject.dao",
"nl.myproject.service",
"nl.myproject.webapp"},
excludeFilters= {
@ComponentScan.Filter(type=FilterType.REGEX,pattern={".*Test.*"}),
@ComponentScan.Filter(type=FilterType.REGEX,pattern={".*AppConfig"})
}
)
@Configuration
@EnableConfigurationProperties
@Import({
JPAConfig.class,
RestConfig.class,
BootConfig.class
})
public class Startup {
public static void main(String[] args) throws Exception {
SpringApplication.run(Startup.class, args);
}
}
@RestController
@RequestMapping(value="/json/tags")
public class JsonTagController extends JsonBaseController {
@Inject
TagManager tagMgr;
public interface TagManager extends BaseManager<Tag,Long> {
[...]
}
@Service("tagManager")
public class TagManagerImpl extends BaseManagerImpl<Tag, Long> implements
TagManager {
@Inject
TagDao dao;
[...]
@Inject
是 Spring 指定的注释。
他们只是进行相同的依赖注入。您可以在同一代码中同时使用它们。只是您需要的修改(关注点分离):@Autowired
只需要做一件事来检查,只需修改为:
public interface TagManager {
[...]
}
@Service
public class TagManagerImpl implements TagManager {
@Inject
private TagDao dao;
// inject that service rather than extending
@Inject
private BaseManager<Tag,Long> baseManager;
}
public interface BaseManager<Tag,Long> {
[...]
}
@Service
public class BaseManagerImpl<Tag,Long> implements BaseManager<Tag,Long> {
....
}
- 只需提供基础包,这足以让 spring 扫描每个包中的组件。