RESTful API with kotlin and Spring Boot

Categories: kotlin   RESTful

Kotlin语言结合Spring Boot 开发RESTful请求的的web项目,Spring 官方提供了一个超级简单的生成项目工具,Spring Initialzr 只要选择相应的构建工具、开发语言和需要依赖的包就行了,非常方便。

SpringBootKotlinDemo 我把生成好的项目放到了Github上面,非常简单的一个例子。使用到了HSQLDBSpring Data JPA,例子中我建了一个Student的实体类,然后使用JPA的API,通过StudentRepository这个接口将对实体信息进行实例化。

使用Kotlin先建一个实体类,Student:

@Entity
class Student(
        var name: String = "",
        var sex: String = "",
        @Id @GeneratedValue(strategy = GenerationType.AUTO)
        var id: Long = 0
)

一如既往的简单明了,什么getter、setter见鬼去吧。通过注解@Entity让JPA识别实体类,还有@Id@GeneratedValue 注解标注了该实体类的主键,以及主键生成方式。

然后给Student创建一个Repository接口,很简单只要集成Spring的CrudRepository接口就好了,基本的增删改查方法就都有了。

interface StudentRepository : CrudRepository<Student, Long> {
    fun findByName(name: String): List<Student>
}

这个接口上面只要根据名称定义一些函数就可以执行了,比如上面的findByName 就会通过Student里面的name属性去查询数据,这个是JPA相关的问题了。

有了上面数据库的操作了就可以定义RESTful请求了,新建一个StudentController,在Spring里面习惯叫Controller

@RestController
@RequestMapping("/students")
class StudentController(val repository: StudentRepository) {


    @GetMapping
    fun findAll() = repository.findAll()

    @PostMapping
    fun addStudent(@RequestBody student:Student) = repository.save(student)

    @PutMapping("/{id}")
    fun updateStudent(@PathVariable id: Long, @RequestBody student: Student) {
        assert(id == student.id)
        repository.save(student)
    }

    @GetMapping("/name/{name}")
    fun findByName(@PathVariable name:String) = repository.findByName(name)

    @GetMapping("/{id}")
    fun findOne(@PathVariable id: Long) = repository.findOne(id)

    @DeleteMapping("/{id}")
    fun deleteById(@PathVariable id: Long) = repository.delete(id)
    
}

类上面的 @RequestMapping("/students") 注解就表示这个类的所有链接都要加上/students这个前缀。然后里面方法上面的 @GetMapping @PostMapping @PutMapping @DeleteMapping 分别就代表了RESTful请求的 GET、POST、PUT、DELETE请求类型。

OK,使用kotlin写的一个简单的依赖Spring的RESTful API项目就有了,这时候想要测试请求,可以通过SpringBoot启动,测试。需要定义一个SpringBootApplication

@SpringBootApplication
open class SpringKotlinApplication {

    @Bean
    open fun init(repository: StudentRepository) = CommandLineRunner {
        repository.save(Student("Fancy","man"))
        repository.save(Student("Lily","women"))
    }
}

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

里面的 init 方法是初始化了一些数据进去,主要定义一个 main 函数,通过这个函数启动项目。

这个时候就可以使用RESTful请求工具对数据进行增删改查了。

GET findAll

GET

GET findById

GET

GET findByName

GET

PUT update name

PUT

GET findById

GET