显示导航

使用GORM和Hibernate构建REST应用程序

365bet地区本指南将演示如何使用365bet地区 GORM和Hibernate来构建REST应用程序

格雷姆·罗彻(Graeme Rocher)

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将构建一个365bet地区365bet地区应用使用GORM for Hibernate访问SQL数据库并以RESTful方式生成JSON响应

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails引导休息休眠初始

您可以直接前往如果你光盘进入grails指南休息休眠完成

365bet地区或者,如果您已经安装了365bet地区,则可以在“终端”窗口中使用以下命令创建新的应用程序

grails创建应用程序的hibernate示例配置文件rest api cd hibernate示例

当。。。的时候创建应用365bet地区命令完成365bet地区将创建一个冬眠的例子目录,其中应用程序配置为默认情况下使用REST创建应用程序休息api配置文件并配置为使用特征

编写申请

现在您可以开始编写应用程序了

配置应用程序

365bet地区默认情况下,365bet地区将创建一个使用H在内存中的SQL数据库365bet地区因此,您无需设置数据库即可开发365bet地区

但是,如果您确实想配置数据库,则可以通过将运行时依赖项添加到相应的JDBC驱动程序中来进行配置。建立gradle

建立gradle
依赖运行时'MySQL连接器'
}

然后更改在中找到的配置grails应用配置会议应用yml默认的全局配置可以在下面看到

grails应用配置会议应用yml
数据源:
    派对: 真正
    jmxExport: 真正
    driverClassName: org h驱动程序
    用户名: 她的
    密码: ''

您会注意到存在特定于环境的配置

grails应用配置会议应用yml
环境:
    发展:
        数据源:
            dbCreate: 创建放置
            : jdbc h mem devDb MVCC TRUE LOCK TIMEOUT DB EXIT FALSE关闭
    测试:
        数据源:
            dbCreate: 更新
            : jdbc h mem testDb MVCC TRUE LOCK TIMEOUT DB关闭时退出假

365bet地区365bet地区带有三个内置环境发展, 测试对应于应用程序将在其中运行的不同环境

要为MySQL更改此设置,您应该指定驱动程序类名称的用户名和密码,以便仅针对发展您可以在发展

grails应用配置会议应用yml
发展:
    数据源:
        driverClassName: com mysql jdbc驱动程序
        dbCreate: 创建放置
        : jdbc mysql localhost测试
        用户名: xxxxxx
        密码: yyyyy

创建域类

SQL数据库中的每个表都由一个GORM域类.

创建域类

grailsw创建域类Product创建grails应用程序域休眠示例Product groovy创建src test groovy休眠示例ProductSpec groovy

另外,您也可以使用自己喜欢的文本编辑器或IDE创建域类

域类是一个简单的Groovy类,您可以使用属性表示数据库中表的每一列。

grails应用程序域休眠示例产品示例
冬眠的例子进口 365bet地区

365bet地区
 产品 {

    那么价钱

应用程序中定义的每个域类都将被编译以实现GormEntity

grails应用程序域休眠示例产品示例
进口 组织grails数据存储gorm

 产品 实施 {
    ..
}

在GORM域类中定义的属性上,您可以使用约束属性

grails应用程序域休眠示例产品示例
静态的空白:范围:0.0..1000.00
}

上面的示例应用了两个约束

  • 那么属性受到限制,因此不能为空字符串

  • 属性受到限制,因此使用时必须大于或小于一千范围约束

要验证这些约束是否符合我们的预期,您可以编写测试。创建域类测试称为src测试groovy休眠示例ProductSpec groovy已经为您生成了,否则只需在src测试使用您的IDE或文本编辑器就足够了

为了在单元测试中有效测试与Hibernate的交互,建议您使用grails测试休眠HibernateSpec您可以将其与内存数据库中的H结合使用

要实现此目的,首先修改产品规格上课如下

src测试groovy休眠示例ProductSpec groovy
进口 grails测试休眠HibernateSpec

然后确保产品规格扩展休眠规范基类

src测试groovy休眠示例ProductSpec groovy
禁止警告(['方法名称', 'DuplicateNumberLiteral'])
 产品规格 延伸休眠规范

休眠规范超类会将每个测试方法包装在一个事务中,该事务在测试结束时会回滚,以确保在测试之间进行清理

365bet地区准备好测试后,您就可以编写测试了。Spock框架这使您可以定义更具可读性的测试,包括名称中包含空格

src测试groovy休眠示例ProductSpec groovy
虚空 '测试域类验证'() {
    ...
}

首先,让我们为无效案例编写测试。您可以使用Spock进行测试什么时候然后块以使测试更具可读性

src测试groovy休眠示例ProductSpec groovy
什么时候: '域类保存了无效数据'产品产品产品那么: '', : -d产品保存然后: '发生错误,数据未保存'产品hasErrors产品错误getFieldError''产品错误getFieldError'那么'产品数量0

上面的示例设置了那么到一个空白值,然后设置为负值,并尝试使用保存方法

然后块断言该对象无效且未保存

要为有效案例编写测试,请填充一些有效数据,然后尝试断言该对象已保存

src测试groovy休眠示例ProductSpec groovy
什么时候: '有效域已保存'产品名称'香蕉'产品价格d产品保存然后: '产品已成功保存'产品数量1产品第一价格d

全部完成现在可以运行测试了gradlew检查从终端窗口中运行,或在IDE中运行测试(如果IDE支持)

gradlew检查

创建一个控制器

现在定义了数据模型,是时候编写了控制器.

最快的方法是创建宁静的控制器终端窗口中的命令

grailsw创建宁静的控制器休眠示例产品创建的grails应用程序控制器休眠示例ProductController groovy

但是,您也可以使用自己喜欢的文本编辑器或IDE轻松创建控制器。

控制器的内容应如下所示

365bet地区应用程序控制器休眠示例ProductController groovy
进口 常规转换CompileStatic

静态编译
 产品控制器 延伸RestfulController静态的responseFormats'json', 'XML文件'产品控制器产品ProductService productService

RestfulController超类将实现所有必要的操作以执行常见的REST动词,例如得到, 开机自检, 如果要覆盖或禁止某些动词,则可以覆盖超类的等效方法,例如删除方法返回替代或禁止的响应

将控制器映射到URI

默认情况下,控制器将在产品URI这是由于默认grails app conf休眠示例UrlMappings groovy

grails应用程序控制器休眠示例UrlMappings groovy
删除"/$控制者/$ID(.$格式)?"(行动: '删除'得到"/$控制者(.$格式)?"(行动: '指数'得到"/$控制者/$ID(.$格式)?"(行动: '节目'发布"/$控制者(.$格式)?"(行动: '保存'"/$控制者/$ID(.$格式)?"(行动: '更新'补丁"/$控制者/$ID(.$格式)?"(行动: '补丁')

如您在上方看到的,每个HTTP动词都被映射,从而使用URI从URI本身建立控制器名称。控制者句法

如果您希望使用其他名称或明确说明所用的URI,则可以使用资源映射

grails应用程序控制器休眠示例UrlMappings groovy
"产品展示"(资源:"产品")

在这种情况下,控制器将被映射到产品展示代替产品.

如果您希望将其他端点添加到REST API,则只需执行相应的操作即可

例如,说您希望能够使用产品搜寻URI和查询为此,第一步是实现一个搜索控制器中的动作

365bet地区应用程序控制器休眠示例ProductController groovy
定义 搜索(q整数最大值(1)
    如果"%${q}%"toString: 数学最小最大10, 100)]) (3)
    }
    其他响应[]) (4)
    }
}
1 一个叫搜索定义采用一个称为q还有一个参数
2 哪里使用SQL执行查询喜欢询问
3 响应方法用于响应结果列表
4 对于未指定查询的情况,我们响应空列表

完成动作后,您现在需要公开产品搜寻通过在中定义适当的映射grails app conf休眠示例UrlMappings groovy:

grails应用程序控制器休眠示例UrlMappings groovy
'产品展示'(资源: '产品'采集'搜索'(控制者: '产品', 行动: '搜索')
    }
}

采集将URI直接嵌套在下面的方法产品展示以URI为例产品搜寻而不是例如将其嵌套在资源标识符下方产品搜寻).

365bet地区请参阅《 365bet地区用户指南》有关控制URI如何映射到控制器的更多信息

测试搜索端点

为该单元编写单元测试搜索您可以使用的动作创建单元测试CLI命令创建一个

grailsw创建单元测试休眠示例ProductController

或者只是创建一个src测试groovy休眠示例ProductControllerSpec groovy使用您喜欢的文本编辑器或IDE的文件

产品规格它应该扩展休眠规范但是这次定义应该是产品控制器:

src测试groovy休眠示例ProductControllerSpec groovy
禁止警告('方法名称')
 产品控制器规格 延伸休眠规范实施ControllerUnitTest {
    ...
}

此外,测试应定义一个doWithSpring阻止以启用JSON视图

src测试groovy休眠示例ProductControllerSpec groovy
静态的

doWithSpring块用于为测试上下文注册其他Spring配置bean。在这种情况下,我们希望测试控制器以JSON视图进行响应,因此jsonSmartViewResolverBean已注册

最后,我们准备实施测试,并可以通过执行搜索传递适当参数并验证写入响应的JSON的方法

src测试groovy休眠示例ProductControllerSpec groovy
    虚空 ''() {
        给定控制器productService存根产品服务findByNameLike产品那么: '苹果', : 2.0)]
        }
        什么时候: '执行查询以查找结果'控制器搜索'pp', 10)

        然后: '回答正确'响应json大小1响应json0那么'苹果'
    }
}

如您从上面的示例中看到的,我们声明了json的属性365bet地区365bet地区呈现的结果JSON看起来像

[{"ID":1,"那么":"苹果","":2.0}]

让我们看一下如何自定义此JSON

自定义JSON输出

365bet地区365bet地区的用途JSON视图表示呈现JSON响应的想法是继续将控制器逻辑与视图逻辑分离的理念

如果未找到特定视图,则呈现默认视图365bet地区应用程序视图对象对象gson:

365bet地区应用程序视图对象对象gson
进口 常规变换

领域 宾语对象json g渲染对象

默认值对象格森视图只是使用g呈现自动生成对象的JSON表示形式的方法

365bet地区如果您想更改JSON的输出,那么在365bet地区中完成的方法是创建一个视图。您可以使用产生意见CLI的命令

grailsw生成视图休眠示例产品渲染模板索引gson到目标grails应用程序视图产品索引gson渲染模板显示gson到目标grails应用程序视图产品显示gson渲染模板域gson到目标grails应用程序视图产品产品gson

如您所见,模板已生成

  • grails应用查看产品索引gson当通常通过GO呈现来自GORM的结果列表的集合时,将使用此视图。响应控制器中的方法

  • grails应用程序浏览量产品显示gson当单个产品实例通过响应控制器中的方法

  • grails应用程序浏览量产品产品gson这是双方使用的模板吉森指数显示gson实际显示数据的视图

的内容产品gson默认情况下看起来像

grails应用程序浏览量产品产品gson
进口 休眠示例产品型号产品产品json g渲染产品

致电g渲染产品输出所有属性

然而jsonproperty是Groovy的一个实例流JsonBuilder您可以根据需要使用它来更改输出

grails应用程序浏览量产品产品gson
进口 休眠示例产品型号产品产品货币货币地区国家货币getInstance语言环境货币getInstance'美元'json id产品ID名称产品名称价格"${货币符号}${产品价格}"
}

在这个简单的示例中,我们根据用户的语言环境输出货币符号,现在生成的JSON看起来像

[{一世d:1,"那么":"苹果","":"$2.0"}]
JSON Views非常灵活,有关根据您的需求定制输出的更多信息,请参见文档.

运行应用程序

要运行该应用程序,请使用gradlew bootRun命令将在端口上启动应用程序

使用POST创建数据

应用程序启动后,您可以创建一个产品使用您的首选HTTP客户端的实例。在以下示例中,我们将使用卷曲.

提交开机自检请求在终端窗口中使用以下内容

curl i H内容类型应用程序json X POST本地产品d名称橙色价格

结果输出将是

HTTP X应用程序上下文应用程序开发位置http localhost产品内容类型应用程序json字符集UTF传输编码编码日期日期星期三十一月GMT名称橙色价格

如您所见,返回了HTTP状态代码

使用GET读取数据

您可以阅读所有产品实例使用得到请求

卷曲我本地主机产品

或只读取一个实例ID:

卷曲我本地主机产品

哪个会回来

HTTP X应用程序上下文应用程序开发内容类型应用程序json字符集UTF传输编码分组日期日期星期三十一月GMT id名称橙色价格

使用PUT更新数据

要更新数据,您可以使用您要更改的ID和URI及数据中的请求

curl i H内容类型应用程序json X PUT本地主机产品d价格

在这种情况下,结果输出将是

HTTP X应用程序上下文应用程序开发位置http localhost产品内容类型应用程序json字符集UTF传输编码编码日期日期星期三十一月GMT id名称橙色价格

如果您尝试使用无效值更新数据

curl i H内容类型应用程序json X PUT本地主机产品d价格

然后将收到错误响应

HTTP X应用程序上下文应用程序开发位置http本地主机产品内容类型应用程序json字符集UTF传输编码分组日期日期星期三十一月GMT消息类类的休眠状态的属性价格示例具有值的产品不在从到路径链接的有效范围内自我href http本地主机产品
错误响应由365bet地区应用程序查看错误gson视图,并且从位于以下位置的消息束中获取消息365bet地区应用程式n

使用DELETE删除数据

删除一个产品只需发送一个请求

卷曲我X删除本地主机产品

如果删除实例成功,则输出为

HTTP X应用程序上下文应用程序开发内容类型应用程序json字符集UTF日期星期三十一月GMT

365bet地区恭喜,您已经使用365bet地区 GORM和Hibernate构建了第一个REST应用程序

请记住,您可以使用右侧的链接获取完整示例的源代码。

365bet地区您需要365bet地区帮助吗

OCI赞助了本指南的创建OCI提供了几种365bet地区365bet地区服务:

免费咨询

365bet地区OCI 365bet地区团队365bet地区包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

365bet地区Grails OCI团队