Spring Boot找不到我的自动装配类(自动装配的成员必须在有效的Spring bean中定义)

时间:2019-06-24 14:45:40

标签: java spring spring-boot

我试图在测试类中使用Spring的autowire注释,以便注入类的实例。

package com.mycom.mycust.processing.tasks.references;

public class ReferenceIdentifierTest {

    @Autowired
    private FormsDB formsDB;

    @PostConstruct
    @Test
    public void testCreateTopLevelReferencesFrom() throws Exception {
        ReferenceIdentifier referenceIdentifier = new ReferenceIdentifier(formsDB);
    }
}

这是FormsDB类:

package com.mycom.mycust.mysql;

import org.springframework.stereotype.Component;
import java.sql.SQLException;

@Component
public class FormsDB extends KeyedDBTable<Form> {

    public FormsDB(ConnectionFactory factory) throws SQLException {
        super(factory.from("former", new FormsObjectMapper()));
    }
}

这是SpringBootApplication类:

package com.mycom.mycust.processing;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan("com.mycom.mycust")
public class Processing implements CommandLineRunner {
    // Code
}

运行测试时,formsDB为空。由于我在测试函数上使用了PostConstruct批注,因此我认为由于找不到该类,因此无法自动装配FormsDB。测试类Autowired的{​​{1}}注释上还有一个IntelliJ警告。但是我将Autowired members must be defined in valid Spring bean (@Component|@Service...)注释放在了Component类的上方,并且还将路径FormsDB放在了SpringBootApplication的com.mycom.mycust注释中。所以我看不到为什么找不到课程。

这是怎么了?

1 个答案:

答案 0 :(得分:3)

您的测试调用缺少一些使自动装配工作的重要注释:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ReferenceIdentifierTest {

    @Autowired
    private FormsDB formsDB;

    @Test
    public void testCreateTopLevelReferencesFrom() throws Exception {
        ReferenceIdentifier referenceIdentifier = new ReferenceIdentifier(formsDB);
    }
}

您还可以删除在测试中没有意义的@PostConstruct。