Data binding Vaadin Grid未显示其应显示的数据库中的数据
我正在编写一个Vaadin-Spring应用程序,但问题是数据库中的数据没有显示在网格中(=用于显示表的Vaadin 8 UI组件) 我怀疑错误可能在哪里(见我在本文末尾的评论) 其他一切(除了网格中未显示的数据)都正常工作。数据库表是在Spring JPA注释的帮助下自动创建的,网格在UI中很好地显示,等等。。。只有数据库中的数据没有显示在网格中 对于这个问题,我创建了一个新的迷你项目。下面是这个小项目的代码。ui只是由一个网格组成,它应该显示数据库的内容。(由于网格不显示任何内容,UI基本上是一个空框架,请参见最后一个屏幕截图) 这个小型项目中的问题与原始(以及更大)项目中的问题相同:数据库中的数据没有显示在网格中 这个小项目叫做“demo”,是在SpringInitializer的帮助下创建的。所选依赖项显示在以下屏幕截图中: 我的演示应用程序由3个小软件包组成:模型、数据库访问和用户界面: 该模型由一个名为“Person”的类组成。以下是此文件的代码: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基本上
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");