我正在重构现有应用程序以使用Spring Boot。我在这里遇到的问题通常是“为什么这不再起作用了”。
我有三个包裹 -nl.myproject.boot -nl.myproject -nl.myproject.rest
我当前的问题是,@Service
中我@Inject
中的所有所有 @RESTController
个在调用方法时解析为null。
服务和dao是nl.myproject程序包的一部分,它不是nl.myproject.core的原因是一个遗留问题。
一个相关的问题是我的@Configuration组件似乎未通过@ComponentScan
加载,因此我必须手动导入它们。我还必须排除测试配置,以防止加载测试配置,这似乎也很奇怪。
启动期间来自服务层的内部调用(例如数据准备)正常工作。还@Inject
任命了任何此类经理。这只是说任何典型的注入错误(例如手动实例化或注入类而不是接口)都不适用。
我也感谢调试技巧。我的Java有点生锈了。
@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;
[...]
答案 0 :(得分:0)
@Inject
是JSR-330(标准)指定的注释,而 @Autowired
是 Spring 指定的注释>。
它们只是执行相同的依赖项注入。可以使用相同的代码来同时使用它们。
只需修改(关注点分离)即可:
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> {
....
}
只需要做一件事即可检查,只需将其修改为 basePackages= {"nl.myproject"}
-仅提供基本软件包,足以满足春季需求扫描每个软件包中的组件。
希望这会有所帮助:)