Data binding Vaadin Grid未显示其应显示的数据库中的数据

Data binding Vaadin Grid未显示其应显示的数据库中的数据,data-binding,vaadin8,vaadin-grid,vaadin-spring-boot,Data Binding,Vaadin8,Vaadin Grid,Vaadin Spring Boot,我正在编写一个Vaadin-Spring应用程序,但问题是数据库中的数据没有显示在网格中(=用于显示表的Vaadin 8 UI组件) 我怀疑错误可能在哪里(见我在本文末尾的评论) 其他一切(除了网格中未显示的数据)都正常工作。数据库表是在Spring JPA注释的帮助下自动创建的,网格在UI中很好地显示,等等。。。只有数据库中的数据没有显示在网格中 对于这个问题,我创建了一个新的迷你项目。下面是这个小项目的代码。ui只是由一个网格组成,它应该显示数据库的内容。(由于网格不显示任何内容,UI基本上

我正在编写一个Vaadin-Spring应用程序,但问题是数据库中的数据没有显示在网格中(=用于显示表的Vaadin 8 UI组件)

我怀疑错误可能在哪里(见我在本文末尾的评论)

其他一切(除了网格中未显示的数据)都正常工作。数据库表是在Spring JPA注释的帮助下自动创建的,网格在UI中很好地显示,等等。。。只有数据库中的数据没有显示在网格中

对于这个问题,我创建了一个新的迷你项目。下面是这个小项目的代码。ui只是由一个网格组成,它应该显示数据库的内容。(由于网格不显示任何内容,UI基本上是一个空框架,请参见最后一个屏幕截图)

这个小型项目中的问题与原始(以及更大)项目中的问题相同:数据库中的数据没有显示在网格中

这个小项目叫做“demo”,是在SpringInitializer的帮助下创建的。所选依赖项显示在以下屏幕截图中:

我的演示应用程序由3个小软件包组成:模型、数据库访问和用户界面:

该模型由一个名为“Person”的类组成。以下是此文件的代码:

package com.example.demo.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="Persons")
public class Person {

    @Id
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
数据库访问包由3个文件组成:

个人知识库, 个人服务和 PersonServiceImpl

。。。其中PersonServiceImpl是PersonService接口的实现

以下是PersonRepository:

package com.example.demo.database_acess;


import com.example.demo.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.stream.Stream;

@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {

    @Query("SELECT p FROM Person p")
    Stream<Person> findAllByCustomQueryAndStream();
}
个人观点:

package com.example.demo.ui;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.spring.annotation.UIScope;
import com.vaadin.ui.VerticalLayout;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;

@UIScope
@SpringView(name= PersonsView.NAME)
public class PersonsView extends VerticalLayout implements View {

    public static final String NAME = "";

    @Autowired
    private PersonsGrid personsGrid;

    @PostConstruct
    void init() {
        setMargin(false);
        addComponent(personsGrid);
        personsGrid.setSizeFull();
    }

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {

    }
}
个人资料:

package com.example.demo.ui;

import com.example.demo.model.Person;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.ui.Grid;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;

@SpringComponent
public class PersonsGrid extends Grid<Person> {

    @Autowired
    private PersonDataProvider personDataProvider;

    @PostConstruct
    void init() {
        setDataProvider(personDataProvider);
    }
}
我在数据库中插入了两个人(比尔和乔治):

但是,这些人不会显示在网格中,如以下屏幕截图所示:

在为网格(PersonGrid)和数据提供者(PersonDataProvider)编写代码时,我遵循了互联网上的示例(例如

。。。我怀疑这两个文件中的一个(即PersonGrid和PersonDataProvider)缺少或出错

然而,我不知道是什么

************************************更新****************************************

我在PersonView类的init函数中添加了以下两行:

personsGrid.addColumn(Person::getName).setCaption("Name");
personsGrid.addColumn(Person::getId).setCaption("ID");

重新启动应用程序后,网格中现在有3行(一行用于标题,一行用于“George”,一行用于“Bill”)

但是:行显示不正确,如以下屏幕截图所示:

在左上角,您可以看到三行的开头,但没有显示任何列

要正确显示数据,我必须做什么

*******************************更新2******************************************

显然,在ResultSet关闭后不允许执行某些SQL操作(请参见下面的屏幕截图)。我不知道这意味着什么


我看不到您手动为
网格定义列。请尝试添加它们。另一种方法是,Vaadin检查bean属性,但您需要在构造函数中指定bean的类。谢谢您的回答。我在PersonView类的init函数中添加了以下两行:personsGrid.addColumn(Person::getName).setCaption(“Name”);addColumn(Person::getId).setCaption(“ID”);重新启动应用程序后,我的网格中确实有3行(1行表示标题,1行表示“George”,1行表示“Bill”)。组件上的红色感叹号表示抛出了错误/异常。我猜您的日志中有一个堆栈跟踪,指向代码中的错误位置。我认为导致问题的唯一原因是:您需要正确实现数据提供程序。fetch方法必须考虑Vaadin offset/limit查询参数(请参阅spring数据存储库的Pageable),并且在数据库事务关闭后,Vaadin可能会对返回的流进行评估。我猜spring数据存储库中的流是惰性获取的(hibernate),因此您可以尝试将其收集为列表,并在数据提供者获取方法中从该列表返回流。我几乎可以肯定,他们是互联网上关于Vaadin&Spring数据的一个很好的例子。我看不到您手动为
网格定义列。请尝试添加它们。另一种方法是,Vaadin检查bean属性,但您需要在构造函数中指定bean的类。谢谢您的回答。我在PersonView类的init函数中添加了以下两行:personsGrid.addColumn(Person::getName).setCaption(“Name”);addColumn(Person::getId).setCaption(“ID”);重新启动应用程序后,我的网格中确实有3行(1行表示标题,1行表示“George”,1行表示“Bill”)。组件上的红色感叹号表示抛出了错误/异常。我猜您的日志中有一个堆栈跟踪,指向代码中的错误位置。我认为导致问题的唯一原因是:您需要正确实现数据提供程序。fetch方法必须考虑Vaadin offset/limit查询参数(请参阅spring数据存储库的Pageable),并且在数据库事务关闭后,Vaadin可能会对返回的流进行评估。我猜spring数据存储库中的流是惰性获取的(hibernate),因此您可以尝试将其收集为列表,并在数据提供者获取方法中从该列表返回流。我几乎可以肯定,他们在互联网上是一个关于Vaadin&Spring数据的好例子。
package com.example.demo.ui;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.spring.annotation.UIScope;
import com.vaadin.ui.VerticalLayout;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;

@UIScope
@SpringView(name= PersonsView.NAME)
public class PersonsView extends VerticalLayout implements View {

    public static final String NAME = "";

    @Autowired
    private PersonsGrid personsGrid;

    @PostConstruct
    void init() {
        setMargin(false);
        addComponent(personsGrid);
        personsGrid.setSizeFull();
    }

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event) {

    }
}
package com.example.demo.ui;

import com.example.demo.model.Person;
import com.vaadin.spring.annotation.SpringComponent;
import com.vaadin.ui.Grid;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PostConstruct;

@SpringComponent
public class PersonsGrid extends Grid<Person> {

    @Autowired
    private PersonDataProvider personDataProvider;

    @PostConstruct
    void init() {
        setDataProvider(personDataProvider);
    }
}
package com.example.demo.ui;

import com.example.demo.database_acess.PersonServiceImpl;
import com.example.demo.model.Person;
import com.vaadin.data.provider.AbstractBackEndDataProvider;
import com.vaadin.data.provider.Query;
import com.vaadin.spring.annotation.SpringComponent;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.stream.Stream;

@SpringComponent
public class PersonDataProvider extends AbstractBackEndDataProvider<Person, Void> {

    @Autowired
    PersonServiceImpl personService;


    public Stream<Person> fetchFromBackEnd(Query<Person, Void> query) {
        return personService.streamAllPersons();
    }

    public int sizeInBackEnd(Query<Person, Void> query) {
        return (int) personService.countPersons();
    }

}
spring.datasource.url=jdbc:mysql://localhost:3306/demoDB
spring.datasource.username=root
spring.datasource.password=mypassword
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
personsGrid.addColumn(Person::getName).setCaption("Name");
personsGrid.addColumn(Person::getId).setCaption("ID");