我正在编写一个Vaadin Spring应用程序,并且存在数据库中的数据未显示在网格中的问题(=用于显示表格的Vaadin 8 UI-Component)。
我怀疑错误的位置(请参阅本文末尾的评论)。
其他所有内容(除了未在网格中显示的数据)工作正常。数据库表是在Spring JPA注释的帮助下自动创建的,网格在UI中很好地显示,等等......只有数据库中的数据没有显示在网格中。
对于这个问题,我创建了一个新的迷你项目。您可以在下面找到这个迷你项目的代码。 ui只包含一个Grid,它应该显示数据库的内容。 (由于Grid没有显示任何内容,UI基本上是一个空框架,请参见最后一个截图)。
此迷你项目中的问题与原始(并且更大)项目中的问题相同:数据库中的数据未显示在网格中。
迷你项目名为" demo"并且是在SpringInitializr的帮助下创建的。选定的依赖项显示在以下屏幕截图中:
我的demo-app包含3个小包:model,database_access和ui:
该模型由一个名为" 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个文件组成:
PersonRepository, PersonService和 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();
}
此处的PersonService:
package com.example.demo.database_acess;
import com.example.demo.model.Person;
import java.util.stream.Stream;
public interface PersonService {
Stream<Person> streamAllPersons();
long countPersons();
}
这里是PersonServiceImpl:
package com.example.demo.database_acess;
import com.example.demo.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.stream.Stream;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonRepository personRepository;
@Transactional
public Stream<Person> streamAllPersons() {
return personRepository.findAllByCustomQueryAndStream();
}
public long countPersons() {
return personRepository.count();
}
}
ui包由以下四个文件组成: GUI,PersonsView,PersonsGrid和PersonDataProvider
GUI:
package com.example.demo.ui;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.Title;
import com.vaadin.navigator.Navigator;
import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.spring.navigator.SpringViewProvider;
import com.vaadin.ui.Panel;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import org.springframework.beans.factory.annotation.Autowired;
@SpringUI
@Title("Demo App")
@Theme("valo")
public class GUI extends UI {
@Autowired
private SpringViewProvider viewProvider;
@Override
protected void init(VaadinRequest request) {
VerticalLayout rootLayout = new VerticalLayout();
rootLayout.setSizeFull();
setContent(rootLayout);
Panel viewContainer = new Panel();
viewContainer.setSizeFull();
rootLayout.addComponent(viewContainer);
rootLayout.setExpandRatio(viewContainer, 1.0f);
Navigator navigator = new Navigator(this, viewContainer);
navigator.addProvider(viewProvider);
}
}
PersonsView:
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) {
}
}
PersonsGrid:
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);
}
}
的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();
}
}
application.properties文件如下所示:
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
我将两个人插入数据库(比尔和乔治):
但是,这些人不会显示在网格中,您可以在以下屏幕截图中看到:
在为Grid(PersonGrid)和DataProvider(PersonDataProvider)编写代码时,我跟踪了来自互联网的示例(例如http://vaadinhelp.co.in/vaadin-dataprovider-example/)
......我怀疑在这两个文件中的一个(即PersonGrid和PersonDataProvider)中缺少或错误。
但是,我不知道是什么。
************************************ UPDATE ********** *********
我在PersonsView-Class的init-function中添加了以下两行:
personsGrid.addColumn(Person::getName).setCaption("Name");
personsGrid.addColumn(Person::getId).setCaption("ID");
重新启动应用程序后,网格中现在有3行(一个用于标题,一个用于&#34; George&#34;一个用于&#34; Bill&#34;)。
但是:行未正确显示,如下面的屏幕截图所示:
在左上角,您可以看到三行的开头,但是没有显示任何列。
我需要做些什么才能正确显示数据?
********** UPDATE2 *************** ***************************
显然,ResultSet关闭后不允许进行某些SQL操作(参见下面的屏幕截图)。我不知道这意味着什么。