LightAdminについて

Spring BootでRailsのScaffoldのように、CRUD Webサービスが立ち上がるライブラリを探していたのですが、LightAdminというライブラリがありました。

公式サイトによるとLightAdminは、luggable CRUD UI library for Java web applications です。
Bootを使わない単独起動もあるようです。

公式サイト http://lightadmin.org/
Github https://github.com/la-team/light-admin
Github https://github.com/la-team/lightadmin-springboot

クイックスタート

lightadmin-springboot プロジェクトからgit cloneして、起動するだけです。

git clone https://github.com/la-team/lightadmin-springboot.git
cd lightadmin-springboot/
mvn spring-boot:run

http://localhost:8080/admin/login

ログイン画面

スクリーンショット 2017-04-11 18.42.26.png
UsernameとPasswordはどちらもadmin

メインメニュー

スクリーンショット 2017-04-11 18.44.20.png

一覧画面

スクリーンショット 2017-04-11 18.45.37.png

MySQLにつないでみる

MySQL環境を用意

手元のMySQL環境に検証用のdbとtableを作成します。

#dockerで立ち上げる例
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
create database testdb;
use testdb;
create table Item(id int,name varchar(10), primary key(id));

JavaCode

元のサンプルモデルを削除

このクラスを全部削除してください。
- src/main/java/org/lightadmin/boot/administration/CityAdministration.java
- src/main/java/org/lightadmin/boot/administration/HotelAdministration.java
- src/main/java/org/lightadmin/boot/domain/City.java
- src/main/java/org/lightadmin/boot/domain/Hotel.java
- src/main/java/org/lightadmin/boot/repository/HotelRepository.java
- src/main/java/org/lightadmin/boot/web/ApplicationController.java

新たなモデルを作成

src/org/lightadmin/boot/domain/Item.java
package org.lightadmin.boot.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Item")
public class Item implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id private Long id;
    @Column private String name;

    public Item() {}
    public Item(Long id, String name, String country) {
        super();
        this.id = id;
        this.name = name;
    }

    public Long getId() {return id;}
    public void setId(Long id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
}
src/main/java/org/lightadmin/boot/administration/ItemAdministration.java
package org.lightadmin.boot.administration;

import org.lightadmin.api.config.AdministrationConfiguration;
import org.lightadmin.api.config.builder.EntityMetadataConfigurationUnitBuilder;
import org.lightadmin.api.config.unit.EntityMetadataConfigurationUnit;
import org.lightadmin.boot.domain.Item;

public class ItemAdministration extends AdministrationConfiguration<Item> {

    @Override
    public EntityMetadataConfigurationUnit configuration(EntityMetadataConfigurationUnitBuilder configurationBuilder) {
        return configurationBuilder.nameField("name").singularName("Item").pluralName("Items").build();
    }
}

DB接続

src/main/java/org/lightadmin/boot/ApplicationConfiguration.java
package org.lightadmin.boot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

import static org.springframework.orm.jpa.vendor.Database.MYSQL;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"org.lightadmin.boot.persistence"})
public class ApplicationConfiguration {

    @Bean
    @Autowired
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
        vendorAdapter.setDatabase(MYSQL);
        vendorAdapter.setShowSql(false);

        final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("org.lightadmin.boot.domain");
        factory.setDataSource(dataSource);

        return factory;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/testdb?useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8&characterEncoding=utf8");
        dataSource.setUsername("root");
        dataSource.setPassword("mysql");
        return dataSource;
    }

}
pom.xml
HSQLDBを削除
         <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
         </dependency>

MySQLを追加
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

結果

スクリーンショット 2017-04-12 11.05.00.png

スクリーンショット 2017-04-12 11.06.16.png

スクリーンショット 2017-04-12 11.06.49.png