显示导航

构建一个使用 GORM 的 Ratpack 应用程序

了解如何构建一个使用 GORM 作为数据访问工具包的 Ratpack 应用程序

作者:Sergio del Amo

Grails 版本:S/N

1 Grails 培训

Grails 培训 - 接受创建并积极维护 Grails 框架的人员的开发和提供!。

2 入门

在本指南中,您将使用 GORM 构建一个 Ratpack 应用程序。

2.1 所需工具

要完成本指南,您需要以下工具

  • 一些空闲时间

  • 一个不错的文本编辑器或 IDE

  • 安装了 JDK 1.8 或更高版本并正确配置了 JAVA_HOME

2.2 如何完成该指南

要开始,请执行以下操作

Grails 指南存储库包含两个文件夹

  • initial 初始项目。

initial 包含一个 Ratpack 应用程序。

build.gradle
plugins {
    id "io.ratpack.ratpack-groovy" version "1.7.5"
}

repositories {
    jcenter()
}

使用 GET / 返回“hello world”的端点。

src/ratpack/Ratpack.groovy
import static ratpack.groovy.Groovy.ratpack

ratpack {
  handlers {
    get {
        render "Hello World"
    }
  }
}
  • complete 一个完整的示例。这是按照指南提供的步骤操作并将这些更改应用于 initial 文件夹的结果。

要完成该指南,请转到 initial 文件夹

  • cd 进入 grails-guides/gorm-ratpack/initial

并按照下一部分中的说明进行操作。

如果您 cd 进入 `grails-guides/gorm-ratpack/complete`,则可以直接进入完成的示例

3 编写应用程序

3.1 配置您的构建

编辑 build.gradle 文件以包含 GORM 依赖项。

build.gradle
repositories {
  jcenter()
  maven { url "https://repo.grails.org/grails/core" }
}
dependencies {
    compile "org.grails:grails-datastore-gorm-hibernate5:7.0.1.RELEASE"
    runtime "com.h2database:h2:1.4.192"
    runtime "org.apache.tomcat:tomcat-jdbc:8.5.0"
    runtime "org.apache.tomcat.embed:tomcat-embed-logging-log4j:8.5.0"
    runtime "org.slf4j:slf4j-api:1.7.10"
}

本指南将使用 H2 内存数据库。

阅读GORM 文档了解更多信息。

3.2 GORM 配置

本指南中开发的 Ratpack 应用使用 Google Guice。Google Guice 提供模块概念,这是一种用于提供对象的配方。

创建模块以配置 GORM。

src/main/groovy/demo/GormModule.groovy
package demo

import com.google.inject.AbstractModule
import com.google.inject.Provides
import groovy.transform.CompileStatic
import org.grails.orm.hibernate.HibernateDatastore

@CompileStatic
class GormModule extends AbstractModule {

    @Override
    protected void configure() {}

    @Provides
    HibernateDatastore hibernateDatastore() {
        Map<String, Object> configuration = [
            'hibernate.hbm2ddl.auto':'create-drop',
            'dataSource.url':'jdbc:h2:mem:myDB'
        ] as Map<String, Object>

        new HibernateDatastore(configuration, getClass().getPackage())
    }
}

如果独立使用,可以通过向 org.grails.orm.hibernate.HibernateDatastore 类传递一个 Map 或 PropertyResolver 接口的实例,来配置 GORM for Hibernate。

3.3 创建领域

创建两个领域对象。

  • Manufacturer.groovy

  • Vehicle.groovy

您可以使用常用的 IDE 创建或执行以下操作

$ cd complete/src/main/groovy/demo
$ touch Manufacturer.groovy
$ touch Vehicle.groovy

现在我们的所有类存根都已经就绪,让我们继续编辑它们。

src/main/groovy/demo/Manufacturer.groovy
package demo

import grails.gorm.annotation.Entity
import groovy.transform.ToString
import org.grails.datastore.gorm.GormEntity

@ToString
@Entity
class Manufacturer implements GormEntity<Manufacturer> {

    String name

    static hasMany = [vehicles: Vehicle]

    static constraints = {
        name blank: false
    }
}
src/main/groovy/demo/domain/Vehicle.groovy
package demo

import grails.gorm.annotation.Entity
import org.grails.datastore.gorm.GormEntity
import groovy.transform.ToString

@ToString
@Entity
class Vehicle implements GormEntity<Vehicle> {
    String name
    Integer year
    static belongsTo = [manufacturer: Manufacturer]

    static constraints = {
        name nullable: false, blank: false
    }
}

ManufacturerVehicle 具有多对一关系。

我们在 Grails 外部使用 GORM。因此,我们需要使用 grails.gorm.annotation.Entity 注释我们的领域类。此外,我们实现了 GormEntity 特征。这仅仅是为了辅助 IDE 在 Grails 外部支持 GORM。

3.4 种子数据

创建一个 Service 来封装应用程序启动时创建示例数据。

/src/main/groovy/demo/BootStrapService.groovy
package demo

import grails.gorm.transactions.Transactional
import groovy.transform.CompileStatic
import org.grails.orm.hibernate.HibernateDatastore
import ratpack.exec.Blocking
import ratpack.service.Service
import ratpack.service.StartEvent

@CompileStatic
class BootStrapService implements Service {
    void onStart(StartEvent e) throws Exception {
        e.getRegistry().get(HibernateDatastore)
        Blocking.exec {
            populateWithSampleData()
        }
    }

    @Transactional
    void populateWithSampleData() {
        Manufacturer audi = new Manufacturer(name: 'audi')
        audi.addToVehicles(new Vehicle(name: 'A3', year: 1996))
        audi.addToVehicles(new Vehicle(name: 'A4', year: 1994))
        audi.save()

        Manufacturer ford = new Manufacturer(name: 'ford')
        ford.addToVehicles(new Vehicle(name: 'Ford KA', year: 1996))
        ford.save()
    }
}

3.5 创建处理器

创建 Handler。我们处理两个请求。

请求 / 将返回制造商列表。请求 /audi/vehicles 将返回名为 audi 的制造商的车辆列表

src/main/groovy/demo/ManufacturerHandler.groovy
package demo

import grails.gorm.transactions.ReadOnly
import groovy.transform.CompileStatic
import ratpack.exec.Blocking
import ratpack.groovy.handling.GroovyContext
import ratpack.groovy.handling.GroovyHandler
import static ratpack.jackson.Jackson.json

@CompileStatic
class ManufacturerHandler extends GroovyHandler {
    @Override
    protected void handle(GroovyContext context) {
        String manufacturerName = context.pathTokens.id
        Blocking.get {
            manufacturerName ? findAllVehicleNameByManufacturerName(manufacturerName) : findAllManufacturerName()
        } then { names ->
            context.render(json(names))
        }
    }

    @ReadOnly
    List<String> findAllVehicleNameByManufacturerName(String manufacturerName) {
        Vehicle.where { manufacturer.name == manufacturerName }.projections {
            property('name')
        }.list() as List<String>
    }
    @ReadOnly
    List<String> findAllManufacturerName() {
        Manufacturer.where {}.projections {
            property('name')
        }.list() as List<String>
    }
}

3.6 Ratpack.groovy

替换 src/ratpack/Ratpack.groovy 的内容。

src/ratpack/Ratpack.groovy
import demo.BootStrapService
import demo.GormModule
import demo.ManufacturerHandler

import static ratpack.groovy.Groovy.ratpack

ratpack {
  bindings {
    module GormModule
    bindInstance new BootStrapService()
    add(new ManufacturerHandler())
  }
  handlers {
    get(":id/vehicles", ManufacturerHandler)
    get(ManufacturerHandler)
  }
}

前面的代码注册了配置 GORM 的 Module、启动时填充数据库的 ServiceHandler

运行应用

./gradlew run

您应该能够调用端点

curl "http://localhost:5050"

并获得响应

["audi","ford"]

或检索制造商的车辆

curl "http://localhost:5050/audi/vehicles"

并获得响应

["A3","A4"]

4 在 GORM 或 Grails 中需要帮助吗?

Object Computing, Inc.(OCI) 赞助了本指南的创建。提供多种咨询和支持服务。

OCI 是 Grails 的总部

了解团队