Vaadin-Grid不显示应该显示的数据库中的数据

时间:2017-08-29 03:17:55

标签: data-binding vaadin8 vaadin-grid vaadin-spring-boot

我正在编写一个Vaadin Spring应用程序,并且存在数据库中的数据未显示在网格中的问题(=用于显示表格的Vaadin 8 UI-Component)。

我怀疑错误的位置(请参阅本文末尾的评论)。

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

对于这个问题,我创建了一个新的迷你项目。您可以在下面找到这个迷你项目的代码。 ui只包含一个Grid,它应该显示数据库的内容。 (由于Grid没有显示任何内容,UI基本上是一个空框架,请参见最后一个截图)。

此迷你项目中的问题与原始(并且更大)项目中的问题相同:数据库中的数据未显示在网格中。

迷你项目名为" demo"并且是在SpringInitializr的帮助下创建的。选定的依赖项显示在以下屏幕截图中:

enter image description here

我的demo-app包含3个小包:model,database_access和ui:

enter image description here

该模型由一个名为" 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

我将两个人插入数据库(比尔和乔治):

enter image description here

但是,这些人不会显示在网格中,您可以在以下屏幕截图中看到:

enter image description here

在为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;)。

但是:行未正确显示,如下面的屏幕截图所示:

enter image description here

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

我需要做些什么才能正确显示数据?

********** UPDATE2 *************** ***************************

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

enter image description here

0 个答案:

没有答案