Spring Boot @Inject代理解析为null

时间:2019-07-17 14:51:16

标签: spring spring-boot spring-mvc

我正在重构现有应用程序以使用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;
[...]

1 个答案:

答案 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"} -仅提供基本软件包,足以满足春季需求扫描每个软件包中的组件。

希望这会有所帮助:)