繁体   English   中英

为什么我在Vaadin / SpringBoot应用程序中使用@Autowired Repository获取NullPointerException?

[英]Why do I get NullPointerException with @Autowired Repository in Vaadin / SpringBoot application?

我开始使用vaadin和spring boot构建一个Web应用程序。 我想创建一个vaadin站点,该站点列出网格中MSSQL Server的数据。 在尝试使用我的@Autowired CrudRepository时,我总是得到NullPointerException。

我已经阅读了很多vaadin和spring教程,在Stackoverflow中搜索了类似的问题但却找不到解决方案。 在大多数情况下出现相同的错误,人们忘记将存储库注释为@Repository或者用新的...创建了UI类。我检查了所有常见的错误,但是我无法使代码工作。 我还写了一个针对数据库的单元测试工作正常!

我的CrudRepository接口与@Repository注释

...
@Repository
public interface BewohnerRepository extends CrudRepository<Bewohner, Integer>{
    ...
}
...

我的UI应该使用@Autowired存储库显示数据

...
@Route("")
@SpringComponent
@Configurable
public class VaadinMainUI extends VerticalLayout {

    @Autowired
    private BewohnerRepository bewohnerRepository;

    public VaadinMainUI() {     
        Grid<Bewohner> grid = new Grid<Bewohner>(Bewohner.class);
        Iterable<Bewohner> bewohnerList = bewohnerRepository.findAll();
        grid.setItems((Collection<Bewohner>) bewohnerList);
        add(grid);
    }

}

我的应用主要类:

...
@SpringBootApplication
public class IndikatorenbogenApplication {

    public static void main(String[] args) {
        SpringApplication.run(IndikatorenbogenApplication.class, args);
    }
}

我的JUnit Test也使用@Autowired存储库(此测试工作正常并列出来自我的数据库的数据:

...

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

    @Autowired
    private BewohnerRepository bewohnerRepository;

    @Test
    public void testInjectedComponentsNotNull() {
        assertNotNull(bewohnerRepository);
    }

    @Test
    public void testFetchData(){
        Iterable<Bewohner> bewohnerList = bewohnerRepository.findAll();
        int count = 0;
        for(Bewohner bewohner : bewohnerList){          
            count++;
            System.out.println(count +": " + bewohner);
        }
        assertEquals(count, 1178);
    }
}

我的预期结果是测试列出的1178行显示在我的VaadinMainUI类的网格中。 但是在开始我的应用程序时,我得到了NullPointerException:

...
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [de.lim.tap.indikatorenbogen.ui.VaadinMainUI]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:184)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1295)
    ... 23 more

您的代码中的问题是您在构造函数VaadinMainUI中使用bewohnerRepository。 在Spring中,自动装配字段在构造函数中不可用,因为在构造函数之后完成了字段注入。 因此,您需要相应地更改代码。 您可以使用自定义方法执行此操作并使用@PostConstruct注释对其进行注释,这使得Spring在注入字段后调用它。

@PostConstruct
private void doGridSetup() {
Grid<Bewohner> grid = new Grid<Bewohner>(Bewohner.class);
        Iterable<Bewohner> bewohnerList = bewohnerRepository.findAll();
        grid.setItems((Collection<Bewohner>) bewohnerList);
        add(grid);
}

或者,作为另一种选择,您可以将bewohnerRepository自动装配为构造函数参数:

@Autowire
public VaadinMainUI(BewohnerRepository bewohnerRepository) {
Grid<Bewohner> grid = new Grid<Bewohner>(Bewohner.class);
        Iterable<Bewohner> bewohnerList = bewohnerRepository.findAll();
        grid.setItems((Collection<Bewohner>) bewohnerList);
        add(grid);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM