1

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

我怀疑错误可能出现在哪里(请参阅我在本文末尾的评论)。

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

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

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

该迷你项目称为“演示”,是在 SpringInitializr 的帮助下创建的。选定的依赖项显示在以下屏幕截图中:

在此处输入图像描述

我的演示应用由 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();
}

这是人员服务:

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

图形用户界面:

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);

    }

}

人员视图:

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();
    }

}

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) 编写代码时,我遵循了来自 Internet 的示例(例如http://vaadinhelp.co.in/vaadin-dataprovider-example/

...我的怀疑是这两个文件之一(即PersonGrid 和PersonDataProvider)中缺少或错误的东西。

然而,我不知道是什么。

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

我在 PersonsView-Class 的初始化函数中添加了以下两行:

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

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

但是:行未正确显示,如您在以下屏幕截图中所见:

在此处输入图像描述

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

我必须做什么才能正确显示数据?

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

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

在此处输入图像描述

4

0 回答 0