【问题标题】:Java Autowired issue [closed]Java自动装配问题[关闭]
【发布时间】:2021-08-06 08:03:08
【问题描述】:

我正在努力解决@Autowired 注释问题。我以这段代码为例,但在我的测试类中,Java 说我的 Autowired 字段是null。当我使用AnnotationConfigApplicationContext 时测试通过但不适用于@Autowired。当我在我的测试类上方添加注释@SpringBootTest 然后@Autowired 字段然后IntelliJ 说“无法自动装配。找不到'库'类型的bean”。我在我的根项目中包含了这个特定的模块。

@Repository
public class LibraryDbController {

    public void saveData(){
        System.out.println("Saving data to the database.");
    }

    public void loadData(){
        System.out.println("Loading data from the database.");
    }

}
@Service
public class Library {

    private final List<String> books = new ArrayList<>();
    private LibraryDbController libraryDbController;

    public Library(LibraryDbController libraryDbController) {
        this.libraryDbController = libraryDbController;
    }

    public void saveToDb(){
        libraryDbController.saveData();
    }

    public void loadFromDb(){
        libraryDbController.loadData();
    }

}
@SpringBootTest
public class LibraryTestSuite {

    @Autowired
    private Library library; //  <--- says "Could not autowire. No beans of 'Library' type found"

    @Test
    void testLoadFromDb(){
        ApplicationContext context = new AnnotationConfigApplicationContext("com.spring");
        Library test = context.getBean(Library.class);

        test.loadFromDb();
    }

    @Test
    void testSaveToDb(){
        library.saveToDb();
    }

}

错误:

无法调用“com.spring.library.Library.saveToDb()”,因为“this.library”为空
java.lang.NullPointerException:无法调用“com.spring.library.Library.saveToDb()”,因为“this.library”为空

我没有注意到当我在上面添加注解@SpringBootTest 时可能会测试类然后所有测试都失败并发生错误:

无法找到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration 或@SpringBootTest(classes=...) java.lang.IllegalStateException:找不到@SpringBootConfiguration,您需要在测试中使用@ContextConfiguration 或@SpringBootTest(classes=...)

【问题讨论】:

  • LibraryDbController中移除final修饰符
  • 请在您的代码中包含这些包,并请添加 @SpringBootApplication 注释类。如果您还没有,那是您的问题。

标签: java spring containers autowired


【解决方案1】:

使用@SpringBootTest@SpringJUnitConfig 注释您的测试类

【讨论】:

  • 谢谢你是对的,但是当我添加 @SpringBootTest 然后 Autowired 变量带有下划线并说“无法自动装配。找不到'库'类型的bean”
  • 您的申请开始了吗?使用带有 @SpringBootApplication 注释的主类?
  • @JUMBO 总是通过构造函数注入组件
【解决方案2】:

LibraryDbController 声明之前删除 final 关键字。

Make Spring Service Classes Final?

【讨论】:

  • 在这种情况下删除 final 不会解决问题。这仅适用于使用基于 class 的代理时,这里不是这种情况(没有为此类制作代理)。此外,如果有一个接口,您可以将您的课程设为final(这也包含在您链接的问题中未接受但更好的答案中)。
  • 它为我解决了。我复制了例子。使用 final 关键字测试没有通过。删除后测试成功通过。
  • 由于本题代码太少,无法复现。所以你创造了一些相似但不一样的东西,因此没有复制。
  • @M.Deinum @Repository 注释是问题所在。 Spring 将尝试为此类创建代理以将所有 SQLException 包装到它自己的异常中
  • 多哈。错过了 @Repository 注释,它以某种方式在内部翻译为 @Component :(。但是,我希望会发生不同的异常。
猜你喜欢
  • 2019-04-30
  • 2023-03-11
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多