构建一个使用 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 如何完成该指南
要开始,请执行以下操作
-
下载并解压缩源代码
或
-
克隆 Git 存储库
git clone https://github.com/grails-guides/gorm-ratpack.git
Grails 指南存储库包含两个文件夹
-
initial
初始项目。
initial
包含一个 Ratpack 应用程序。
plugins {
id "io.ratpack.ratpack-groovy" version "1.7.5"
}
repositories {
jcenter()
}
使用 GET /
返回“hello world”的端点。
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 依赖项。
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。
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
现在我们的所有类存根都已经就绪,让我们继续编辑它们。
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
}
}
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
}
}
Manufacturer
和 Vehicle
具有多对一关系。
我们在 Grails 外部使用 GORM。因此,我们需要使用 grails.gorm.annotation.Entity
注释我们的领域类。此外,我们实现了 GormEntity
特征。这仅仅是为了辅助 IDE 在 Grails 外部支持 GORM。
3.4 种子数据
创建一个 Service
来封装应用程序启动时创建示例数据。
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
的制造商的车辆列表
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
的内容。
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
、启动时填充数据库的 Service
和 Handler
。
运行应用
./gradlew run
您应该能够调用端点
curl "http://localhost:5050"
并获得响应
["audi","ford"]
或检索制造商的车辆
curl "http://localhost:5050/audi/vehicles"
并获得响应
["A3","A4"]