読者です 読者をやめる 読者になる 読者になる

Spring Boot with Vaadin 〜その2 : JPA で Grid 表示〜


f:id:Naotsugu:20160113010339p:plain

前回Spring Boot with Vaadin 〜その1〜 - A Memorandumに続き、JPAで取得したデータをグリットで表示する簡単なサンプル。

面倒くさいので Groovy で書くことにする。


依存の追加

build.gradle にJPA関連の依存を追加する。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.3.1.RELEASE'
    }
}

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'
apply plugin: 'spring-boot'

repositories {
    jcenter()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.5'
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile 'com.vaadin:vaadin-spring-boot-starter:1.0.0'
    compile 'com.h2database:h2:1.4.190'
    testCompile 'org.springframework.boot:spring-boot-starter-test' 
}

前回からの変更は、groovy プラグイン入れたのと、groovy-allspring-boot-starter-data-jpah2 を依存に追加しただけ。


Entityの作成

src/main/groovy/hello/Customer.groovy

package hello

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.Id

@Entity
@groovy.transform.TupleConstructor(excludes="id")
class Customer {
    @Id @GeneratedValue Long id
    String firstName
    String lastName
}

簡単な Customer Entity。

@TupleConstructor で定義順のコンストラクタの生成を Groovy の AST変換で行う。 id は自動採番なので除外。


Repository の作成

src/main/groovy/hello/CustomerRepository.groovy

package hello

import org.springframework.data.repository.CrudRepository

interface CustomerRepository extends CrudRepository<Customer, Long> {
}

インターフェース定義しとけば SpringData がよろしくやってくれるのでこれだけ。


Application クラスの変更

src/main/groovy/hello/Application.groovy

package hello

import com.google.gwt.thirdparty.guava.common.collect.Lists
import com.vaadin.annotations.Theme
import com.vaadin.data.util.BeanItemContainer
import com.vaadin.server.VaadinRequest
import com.vaadin.spring.annotation.SpringUI
import com.vaadin.ui.Grid
import com.vaadin.ui.Notification
import com.vaadin.ui.UI
import com.vaadin.ui.VerticalLayout
import groovy.transform.CompileStatic
import org.springframework.beans.factory.annotation.Autowired

@SpringUI @Theme("valo")
class VaadinUI extends UI {

    @Autowired CustomerRepository repo;

    @Override @CompileStatic
    protected void init(VaadinRequest request) {

        VerticalLayout content = new VerticalLayout()
        content.setMargin(true)
        setContent(content)

        Grid grid = new Grid(new BeanItemContainer(Customer.class, Lists.newArrayList(repo.findAll())))
        grid.setColumnOrder("id", "firstName", "lastName")
        grid.removeColumn("metaClass")

        grid.addSelectionListener({selectionEvent ->
            def selectionModel = grid.getSelectionModel() as Grid.SingleSelectionModel
            if (selectionModel.getSelectedRow() == null) return
            Notification.show("Selected : " +
              grid.getContainerDataSource().getItem(selectionModel.getSelectedRow()).getItemProperty("firstName"),
                    Notification.Type.TRAY_NOTIFICATION)
        });
        content.addComponent(grid)

    }
}

VerticalLayout でレイアウトコンテナを定義して、その中に Grid コンポーネントを追加している。

Grid には リポジトリから取得したデータを BeanItemContainer で追加。この時、Groovy が Customer クラスに metaClass プロパティを追加するので、Grid に表示しないように削除。

Grid の選択時のリスナを登録して選択項目を Notification で表示。

実行

$ ./gradlew bootRun

f:id:Naotsugu:20160116023138p:plain

レコード選択時。

f:id:Naotsugu:20160116024521p:plain

今回はここまで。

Spring Boot Cookbook

Spring Boot Cookbook

Vaadin 7 Cookbook

Vaadin 7 Cookbook