Spring boot @Inject 代理解析为 null

问题描述 投票:0回答:1

我正在重构现有应用程序以使用 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;
[...]
spring spring-boot spring-mvc
1个回答
0
投票
@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 扫描每个包中的组件。


© www.soinside.com 2019 - 2024. All rights reserved.