1. 程式人生 > >Spring Boot與Kotlin使用Spring Data Rest建立HAL風格Restful介面

Spring Boot與Kotlin使用Spring Data Rest建立HAL風格Restful介面

REST web服務已成為在web上應用程式整合的首選方式。在其核心中,REST定義了系統由客戶端互動的資源組成。這些資源以超媒體驅動的方式實現。Spring MVC為構建這些服務提供了堅實的基礎。但是,對於多域物件系統,即使實施REST web服務的最簡單原則也可能相當乏味,並且導致大量樣板程式碼。

Spring Data REST構建在Spring Data repositories之上,並自動將其匯出為REST資源。它利用超媒體來允許客戶端查詢儲存庫暴露的功能,並將這些資源自動整合到相關的超媒體功能中。

  • 根據model,生成HAL風格的restful API
  • 根據model,維護實體之間的關係
  • 支援分頁
  • 允許動態地過濾集合資源
  • 允許通過處理Spring ApplicationEvents處理REST請求。
  • 目前支援JPA,MongoDB,Neo4j,Solr,Cassandra,Gemfire。
  • 支援自定義

將Spring Data REST新增到Spring Boot專案

dependencies {
    ...
    compile "org.springframework.boot:spring-boot-starter-data-rest:$spring_boot_version"
    ...
}

完整的build.gradle檔案

group 'name.quanke.kotlin'
version '1.0-SNAPSHOT' buildscript { ext.kotlin_version = '1.2.10' ext.spring_boot_version = '1.5.4.RELEASE' ext.springfox_swagger2_version = '2.7.0' ext.mysql_version = '5.1.21' ext.mybatis_version = '1.1.1' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version
"
classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version") // Kotlin整合SpringBoot的預設無參建構函式,預設把所有的類設定open類外掛 classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version") classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version") } } apply plugin: 'kotlin' apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin apply plugin: 'org.springframework.boot' apply plugin: "kotlin-jpa" //https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell jar { baseName = 'chapter11-6-7-service' version = '0.1.0' } repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile("org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}") compile "org.springframework.boot:spring-boot-starter-data-jpa:$spring_boot_version" compile "org.springframework.boot:spring-boot-starter-data-rest:$spring_boot_version" compile "mysql:mysql-connector-java:$mysql_version" testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" }

建立物件User


import javax.persistence.*

/**
 * Created by http://quanke.name on 2018/1/10.
 */

@Entity
data class User(
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        var id: Long = -1,
        @Column(nullable = false)
        var username: String = "",

        var password: String = ""


)

建立UserRepository


import name.quanke.kotlin.chaper11_6_7.entity.User
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param
import org.springframework.data.rest.core.annotation.RepositoryRestResource

@RepositoryRestResource(path="user")
interface UserRepository : JpaRepository<User, Long> {

    fun findByUsername(username: String): List<User>

    fun findByUsernameAndPassword(username: String, password: String?): User

    @Query("from User u where u.username=:username")
    fun findUser(@Param("username") username: String): User

}

配置

application.yml檔案中增加

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

啟動

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication


/**
 * Created by http://quanke.name on 2018/1/9.
 */

//參考:http://blog.csdn.net/soul_code/article/details/54108105

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    SpringApplication.run(Application::class.java, *args)
}

測試

訪問 127.0.0.1:8080/user

返回:

{
    "_embedded": {
        "users": [
            {
                "username": "http://gof.quanke.name",
                "password": "1111",
                "_links": {
                    "self": {
                        "href": "http://127.0.0.1:8083/user/73"
                    },
                    "user": {
                        "href": "http://127.0.0.1:8083/user/73"
                    }
                }
            },
            {
                "username": "java.quanke.name",
                "password": "12",
                "_links": {
                    "self": {
                        "href": "http://127.0.0.1:8083/user/74"
                    },
                    "user": {
                        "href": "http://127.0.0.1:8083/user/74"
                    }
                }
            },
            {
                "username": "test.quanke.name",
                "password": "aa",
                "_links": {
                    "self": {
                        "href": "http://127.0.0.1:8083/user/75"
                    },
                    "user": {
                        "href": "http://127.0.0.1:8083/user/75"
                    }
                }
            },
            {
                "username": "es.quanke.name",
                "password": "12",
                "_links": {
                    "self": {
                        "href": "http://127.0.0.1:8083/user/76"
                    },
                    "user": {
                        "href": "http://127.0.0.1:8083/user/76"
                    }
                }
            },
            {
                "username": "as.quanke.name",
                "password": "12",
                "_links": {
                    "self": {
                        "href": "http://127.0.0.1:8083/user/77"
                    },
                    "user": {
                        "href": "http://127.0.0.1:8083/user/77"
                    }
                }
            },
            {
                "username": "vertx.quanke.name",
                "password": "12",
                "_links": {
                    "self": {
                        "href": "http://127.0.0.1:8083/user/78"
                    },
                    "user": {
                        "href": "http://127.0.0.1:8083/user/78"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://127.0.0.1:8083/user{?page,size,sort}",
            "templated": true
        },
        "profile": {
            "href": "http://127.0.0.1:8083/profile/user"
        },
        "search": {
            "href": "http://127.0.0.1:8083/user/search"
        }
    },
    "page": {
        "size": 20,
        "totalElements": 6,
        "totalPages": 1,
        "number": 0
    }
}

訪問 127.0.0.1:8083/user/73

注意: 73 是user id 根據自己的實際情況測試

返回:

{
    "username": "http://gof.quanke.name",
    "password": "1111",
    "_links": {
        "self": {
            "href": "http://127.0.0.1:8083/user/73"
        },
        "user": {
            "href": "http://127.0.0.1:8083/user/73"
        }
    }
}

Spring Data REST 能做的事情很多,這篇文章先介紹到這裡,先在這裡埋個坑,之後會出更加詳細的文章說Spring Data REST。

更多Spring Boot 和 kotlin相關內容

全科龍婷

參考

相關推薦

Spring BootKotlin使用Spring Data Rest建立HAL風格Restful介面

REST web服務已成為在web上應用程式整合的首選方式。在其核心中,REST定義了系統由客戶端互動的資源組成。這些資源以超媒體驅動的方式實現。Spring MVC為構建這些服務提供了堅實的基礎。但是,對於多域物件系統,即使實施REST web服務的最簡單原則

Spring BootSpring Data JPA

images name spa div pub oid cts cti toc 1、創建實體類bean package com.example.bean; import javax.persistence.*; @Table(name="grade") @Entity

spring-bootspring-data-JPA的簡單集成使用

integer state 關聯 RF tst 不能 工廠 top 登錄密碼 如何在boot中輕松使用JPA <!--首先引入JPA依賴--><dependency> <groupId>org.springframework.boo

Spring Boot系列(五)建立jar熱部署

建立一個完全自包含的可執行jar檔案,該jar檔案可以在生產環境執行。可執行jars(有時候被稱為胖jars "fat jars")是包含你的編譯後的類和你的程式碼執行所需的依賴jar的存檔。 可執行jars在Java沒有提供任何標準的載入內嵌jar檔案(即jar檔案中還包含jar檔案)的方法。如果想

spring boot spring cloud 關系

automatic intel tro imu zed ont jet cloud party 公司使用spring cloud,所以稍微了解一下 看了一下spring官網對 spring boot 以及 spring cloud 的解釋 Spring Boot Spr

spring boot thymeleaf (1): 國際化

javaee 文件內容 裏的 auto 簡體 第一次 1.0 i18n 自定義顯示 在thymeleaf 裏面有個消息表達式: #{...} , 可以借此來實現國際化. 在我使用這個功能的時候, 碰到了一個問題, 按照 JavaEE開發的顛覆者 Spring Boot實戰

spring boot thymeleaf (3): 設置屬性、條件、遍歷、局部變量、優先級、內聯語法

負數 使用 cnblogs ttr price n) 原型 demo 解析結果 前面記錄了 thymeleaf 基本表達式, 這裏繼續看一下其他功能. 一. 設置屬性值 這裏的controller, html框架 還是沿用上一篇的部分. html: <div cl

spring bootjdbcTemplate的整合案例2

database bean n) ret struct mapping rri ott mode 簡單入門了spring boot後,接下來寫寫跟數據庫打交道的案例。博文采用spring的jdbcTemplate工具類與數據庫打交道。 下面是搭建的springbo

spring bootspring mvc的區別是什麽?

安裝 基礎上 處理 tro str session 出了 描述 資源 Spring 框架就像一個家族,有眾多衍生產品例如 boot、security、jpa等等。但他們的基礎都是Spring 的 ioc和 aop ioc 提供了依賴註入的容器 aop ,解決了面向橫切面的編

Spring bootSpring

pos cloud web 隨著 解決方案 r文件 OS gpo boot 1、Spring boot的目的在於創建和啟動新的基於Spring框架的項目,大部分Spring boot應用只需要非常少的配置就可以快速運行起來。2、Spring boot是伴隨著Spring4.

Spring Boot學習筆記——Spring BootRedis的集成

pac urn prope web property static 接口 per select 一.添加Redis緩存 1.添加Redis起步依賴 在pom.xml中添加Spring Boot支持Redis的依賴配置,具體如下: <dependency>

spring boot shiro的簡單整合使用

scheduler div turn map 用戶 ttr algorithm pen enc shrio官網:https://shiro.apache.org/ Apache Shiro是一個功能強大且易於使用的Java安全框架,可執行身份驗證,授權,加密和會話管理。借助

Spring BootDocker部署

map add 官方 完整 -i world [] mage mode Spring Boot與Docker部署 開啟Docker遠程訪問   首先需要開啟docker遠程訪問功能,以便可以進行遠程操作。 CentOS 6   修改/etc/de

Spring Boot消息(rabbtiMQ)

直接 9.png 路由 組成 分享 獲得 不同 應用程序 消息路由 1.大多應用中,可通過消息服務中間件來提升系統異步通信、擴展解耦能力 1.1異步通信 1.2解耦 1.3削峰 2.消息服務中兩個重要概念: 消息代理(message broker)和

Spring Cloud、Spring BootDocker 學習資料匯總

space 學習資料 muc 配套 -s ring blog sta com 使用Spring Cloud與Docker實戰微服務https://gitee.com/itmuch/spring-cloud-bookhttps://eacdy.gitbooks.io/spri

Spring bootJackson ObjectMapper

集成 pro cep println orf 輸出結果 ctf mes pub Spring Boot支持與三種JSON mapping庫集成:Gson、Jackson和JSON-B。Jackson是首選和默認的。 Jackson是spring-boot-starter-j

Spring Boot整合Spirng-data-jpa及使用

Spring-data-jpa可根據實體類自動建立表結構,提供基本的增刪改查方法,資料訪問層非常簡潔,只是一層介面。 1.pom引進依賴 <!--dataSource--> <dependency> <groupI

Apache Shiro(三)——Spring Boot Shiro的 整合

在瞭解了Apache Shiro的架構、認證、授權之後,我們來看一下Shiro與Web的整合。下面以Spring Boot為例,介紹一下Spring Boot 與 Shiro的 整合。 一、建立一個Spring Boot專案 可以使用IDEA快速建立一個Spring Boot專

Spring Boot使用AOP實現REST接口簡易靈活的安全認證

all 高級 mes 之前 接口 封裝 msg mage ror 本文將通過AOP的方式實現一個相對更加簡易靈活的API安全認證服務。 我們先看實現,然後介紹和分析AOP基本原理和常用術語。 一、Authorized實現1、定義註解 package com.power.de

Spring Boot Activiti 6 錯誤記錄

Spring Boot 與 Activiti 6 錯誤記錄 Spring Boot 2.x 與 Activiti 6 整合的錯誤記錄 1. 在啟動類上排除排除SecurityAutoConfiguration類 起因:升級Spri