Spring:无法自动装配字段 - 找不到类型的bean

时间:2017-03-23 20:11:35

标签: java spring intellij-idea

我正在苦苦挣扎几个小时,但无法确定我的设置有什么问题......

目前,在TestController中,引擎字段标有错误

  

“无法自动装配。没有找到'ServerEngine'类型的bean”。

我已尝试将@SpringBootApplication替换为@Configuration@EnableAutoConfiguration@ComponentScan,但仍会收到错误。

以下是相关文件:

Application.java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applictionContext.xml");
        SpringApplication.run(Application.class, args);
    }
}

ServerEngine.java(充当主系统的单例)

public class ServerEngine {

    @Autowired
    private DataLayer dataLayer;
    public DataLayer getDal(){
        return dataLayer;
    }

    @Autowired
    private UsersDal usersDal;
    public UsersDal getUsersDal(){
        return usersDal;
    }

}

TestController.java

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    ServerEngine engine;

    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public void test(HttpServletRequest request, HttpServletResponse response){    
        engine.getUsersDal().addOrUpdateUser(...);
    }
}

applictionContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="serverEngine" class="partners.dataaccess.ServerEngine"/>

    <bean id="usersDal" class="partners.dataaccess.UsersDal"/>
    <bean id="dataLayer" class="partners.dal.DataLayer">
        <constructor-arg name="username" value="..."/>
        <constructor-arg name="password" value="..."/>
        <constructor-arg name="url" value="..."/>
    </bean>
</beans>

2 个答案:

答案 0 :(得分:4)

main中,您要实例化ApplicationContext applicationContext,但之后不做任何操作 - 您不会将其传递给SpringApplication

我不熟悉Spring Boot,但我发现代码中没有任何地方可以为SpringApplication提供XML配置的名称。所以它可能只使用注释配置。

最后,由于ServerEngine未使用@Service注释,因此在组件扫描期间不会将其实例化为Spring bean。

答案 1 :(得分:1)

最简单和最好的解决方案是使用注释@Service或@Component注释您在应用程序中自动装配的类,如ServerEngine,UsersDal和DataLayer。如果你这样做,你就不必在xml或java配置中为它们显式创建bean。