diff --git a/ratpack/build.gradle b/ratpack/build.gradle
index 25af3ddb51..c997b4e697 100644
--- a/ratpack/build.gradle
+++ b/ratpack/build.gradle
@@ -14,6 +14,8 @@ if (!JavaVersion.current().java8Compatible) {
apply plugin: "io.ratpack.ratpack-java"
apply plugin: 'java'
+apply plugin: 'groovy'
+apply plugin: 'io.ratpack.ratpack-groovy'
repositories {
jcenter()
diff --git a/ratpack/pom.xml b/ratpack/pom.xml
index 7c145eff91..0df313c05e 100644
--- a/ratpack/pom.xml
+++ b/ratpack/pom.xml
@@ -26,11 +26,21 @@
ratpack-core
${ratpack.version}
+
+ org.codehaus.groovy
+ groovy-sql
+ ${groovy.sql.version}
+
io.ratpack
ratpack-hikari
${ratpack.version}
+
+ io.ratpack
+ ratpack-groovy-test
+ ${ratpack.test.latest.version}
+
io.ratpack
ratpack-hystrix
@@ -91,6 +101,7 @@
4.5.3
4.4.6
1.5.12
+ 2.4.15
+ 1.6.1
-
diff --git a/ratpack/src/main/groovy/com/baeldung/Ratpack.groovy b/ratpack/src/main/groovy/com/baeldung/Ratpack.groovy
new file mode 100644
index 0000000000..4d8814b627
--- /dev/null
+++ b/ratpack/src/main/groovy/com/baeldung/Ratpack.groovy
@@ -0,0 +1,76 @@
+package com.baeldung;
+
+@Grab('io.ratpack:ratpack-groovy:1.6.1')
+import static ratpack.groovy.Groovy.ratpack
+
+import com.baeldung.model.User
+import com.google.common.reflect.TypeToken
+import ratpack.exec.Promise
+import ratpack.handling.Context
+import ratpack.jackson.Jackson
+import groovy.sql.Sql
+import java.sql.Connection
+import java.sql.PreparedStatement
+import java.sql.ResultSet
+import ratpack.hikari.HikariModule
+import javax.sql.DataSource;
+
+ratpack {
+ serverConfig { port(5050) }
+ bindings {
+ module(HikariModule) { config ->
+ config.dataSourceClassName = 'org.h2.jdbcx.JdbcDataSource'
+ config.addDataSourceProperty('URL', "jdbc:h2:mem:devDB;INIT=RUNSCRIPT FROM 'classpath:/User.sql'")
+ }
+ }
+
+ handlers {
+
+ get { render 'Hello World from Ratpack with Groovy!!' }
+
+ get("greet/:name") { Context ctx ->
+ render "Hello " + ctx.getPathTokens().get("name") + "!!!"
+ }
+
+ get("data") {
+ render Jackson.json([title: "Mr", name: "Norman", country: "USA"])
+ }
+
+ post("user") {
+ Promise user = parse(Jackson.fromJson(User))
+ user.then { u -> render u.name }
+ }
+
+ get('fetchUserName/:id') { Context ctx ->
+ Connection connection = ctx.get(DataSource.class).getConnection()
+ PreparedStatement queryStatement = connection.prepareStatement("SELECT NAME FROM USER WHERE ID=?")
+ queryStatement.setInt(1, Integer.parseInt(ctx.getPathTokens().get("id")))
+ ResultSet resultSet = queryStatement.executeQuery()
+ resultSet.next()
+ render resultSet.getString(1)
+ }
+
+ get('fetchUsers') {
+ def db = [url:'jdbc:h2:mem:devDB']
+ def sql = Sql.newInstance(db.url, db.user, db.password)
+ def users = sql.rows("SELECT * FROM USER");
+ render(Jackson.json(users))
+ }
+
+ post('addUser') {
+ parse(Jackson.fromJson(User))
+ .then { u ->
+ def db = [url:'jdbc:h2:mem:devDB']
+ Sql sql = Sql.newInstance(db.url, db.user, db.password)
+ sql.executeInsert("INSERT INTO USER VALUES (?,?,?,?)", [
+ u.id,
+ u.title,
+ u.name,
+ u.country
+ ])
+ render "User $u.name inserted"
+ }
+ }
+ }
+}
+
diff --git a/ratpack/src/main/groovy/com/baeldung/RatpackGroovyApp.groovy b/ratpack/src/main/groovy/com/baeldung/RatpackGroovyApp.groovy
new file mode 100644
index 0000000000..95ada25e60
--- /dev/null
+++ b/ratpack/src/main/groovy/com/baeldung/RatpackGroovyApp.groovy
@@ -0,0 +1,12 @@
+package com.baeldung;
+
+public class RatpackGroovyApp {
+
+ public static void main(String[] args) {
+ File file = new File("src/main/groovy/com/baeldung/Ratpack.groovy");
+ def shell = new GroovyShell()
+ shell.evaluate(file)
+ }
+
+}
+
diff --git a/ratpack/src/main/groovy/com/baeldung/model/User.groovy b/ratpack/src/main/groovy/com/baeldung/model/User.groovy
new file mode 100644
index 0000000000..0fe4c6c367
--- /dev/null
+++ b/ratpack/src/main/groovy/com/baeldung/model/User.groovy
@@ -0,0 +1,9 @@
+package com.baeldung.model
+
+class User {
+
+ long id
+ String title
+ String name
+ String country
+}
diff --git a/ratpack/src/main/resources/User.sql b/ratpack/src/main/resources/User.sql
new file mode 100644
index 0000000000..a3e2242283
--- /dev/null
+++ b/ratpack/src/main/resources/User.sql
@@ -0,0 +1,10 @@
+DROP TABLE IF EXISTS USER;
+CREATE TABLE USER (
+ ID BIGINT AUTO_INCREMENT PRIMARY KEY,
+ TITLE VARCHAR(255),
+ NAME VARCHAR(255),
+ COUNTRY VARCHAR(255)
+);
+
+INSERT INTO USER VALUES(1,'Mr','Norman Potter', 'USA');
+INSERT INTO USER VALUES(2,'Miss','Ketty Smith', 'FRANCE');
\ No newline at end of file
diff --git a/ratpack/src/test/groovy/com/baeldung/RatpackGroovySpec.groovy b/ratpack/src/test/groovy/com/baeldung/RatpackGroovySpec.groovy
new file mode 100644
index 0000000000..726d703a06
--- /dev/null
+++ b/ratpack/src/test/groovy/com/baeldung/RatpackGroovySpec.groovy
@@ -0,0 +1,46 @@
+package com.baeldung;
+
+import ratpack.groovy.Groovy
+import ratpack.groovy.test.GroovyRatpackMainApplicationUnderTest;
+import ratpack.test.http.TestHttpClient;
+import ratpack.test.ServerBackedApplicationUnderTest;
+import org.junit.Test;
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import ratpack.test.MainClassApplicationUnderTest
+
+class RatpackGroovySpec {
+
+ ServerBackedApplicationUnderTest ratpackGroovyApp = new MainClassApplicationUnderTest(RatpackGroovyApp.class)
+ @Delegate TestHttpClient client = TestHttpClient.testHttpClient(ratpackGroovyApp)
+
+ @Test
+ void "test if app is started"() {
+ when:
+ get("")
+
+ then:
+ assert response.statusCode == 200
+ assert response.body.text == "Hello World from Ratpack with Groovy!!"
+ }
+
+ @Test
+ void "test greet with name"() {
+ when:
+ get("greet/Lewis")
+
+ then:
+ assert response.statusCode == 200
+ assert response.body.text == "Hello Lewis!!!"
+ }
+
+ @Test
+ void "test fetchUsers"() {
+ when:
+ get("fetchUsers")
+
+ then:
+ assert response.statusCode == 200
+ assert response.body.text == '[{"ID":1,"TITLE":"Mr","NAME":"Norman Potter","COUNTRY":"USA"},{"ID":2,"TITLE":"Miss","NAME":"Ketty Smith","COUNTRY":"FRANCE"}]'
+ }
+}