tig*_*igu 3 java autowired vaadin spring-boot vaadin-flow
我开始用vaadin和spring boot构建一个Web应用程序。我想创建一个vaadin站点,该站点在网格中列出来自MSSQL Server的数据。尝试使用@Autowired CrudRepository时,我总是会收到NullPointerException。
我已经阅读了很多vaadin和Spring教程,在Stackoverflow中搜索了类似的问题,但仍未找到解决方案。在大多数情况下,如果发生相同的错误,人们会忘记将存储库注释为@Repository或使用新的UI类来创建UI类……我检查了所有常见的错误,但我的代码无法正常工作。我还针对数据库编写了单元测试,效果很好!
我的带有@Repository批注的CrudRepository接口
...
@Repository
public interface BewohnerRepository extends CrudRepository<Bewohner, Integer>{
...
}
...
Run Code Online (Sandbox Code Playgroud)
我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序主班:
...
@SpringBootApplication
public class IndikatorenbogenApplication {
public static void main(String[] args) {
SpringApplication.run(IndikatorenbogenApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的JUnit测试也使用@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的预期结果是测试列出的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
Run Code Online (Sandbox Code Playgroud)
您的代码中的问题是您正在构造函数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);
}
Run Code Online (Sandbox Code Playgroud)
或者,作为另一种选择,您可以自动连接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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |