使用Kotlin语言写Leancloud云后台服务

最近在玩微信小程序,有一部分业务需要部署后端,为了省事我选择了Leancloud。它有多种语言支持,文档也很完善,能快速搭建服务,正好合适。其后端云引擎支持Node.js、Python、Java、Php四种语言,因为我近来写Android多一些,所以采用了更熟悉的Java。

下载了SDK来一看,是基于maven构建,用法挺简单。但我的云服务需要用到的一个算法是我以前在Android上用Kotlin写的,为了避免重新翻译,我尝试将Kotlin也引入云引擎项目,果然可行。在这记录分享一下。

整个修改分为三步

1. pom配置

增加kotlin的依赖与maven-plugin的配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    ...
    <dependencies>
        ...
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>1.0.5</version>
        </dependency>
        ...
    </dependencies>

    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>1.0.5</version>
                <executions>
                    <execution>
                        <id>compile</id>
                        <goals> <goal>compile</goal> </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <goals> <goal>test-compile</goal> </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                            </sourceDirs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
    </build>
</project>

所以工程的文件结构是这样的

2. 翻译AppInitListener类为Kotlin语言版

package com.cpiz.loanassistant.cloud

import cn.leancloud.LeanEngine
import com.avos.avoscloud.AVOSCloud
import com.avos.avoscloud.internal.impl.JavaRequestSignImplementation
import org.apache.logging.log4j.LogManager
import javax.servlet.ServletContextEvent
import javax.servlet.ServletContextListener
import javax.servlet.annotation.WebListener

@WebListener
class AppInitListener : ServletContextListener {

    private val appId = System.getenv("LEANCLOUD_APP_ID")
    private val appKey = System.getenv("LEANCLOUD_APP_KEY")
    private val appMasterKey = System.getenv("LEANCLOUD_APP_MASTER_KEY")

    override fun contextDestroyed(arg0: ServletContextEvent) {
    }

    override fun contextInitialized(arg0: ServletContextEvent) {
        logger.info("LeanEngine app init.")
        logger.info("Environment: ${System.getenv("LEANCLOUD_APP_ENV")}")

        // 初始化AVOSCloud,请保证在整个项目中间只初始化一次
        LeanEngine.initialize(appId, appKey, appMasterKey)

        // 在请求签名中使用masterKey以激活云代码的最高权限
        JavaRequestSignImplementation.instance().setUseMasterKey(true)

        // 向云引擎注册云函数
        // com.cpiz.loanassistant.cloud.CloudKt即为云函数的实现
        LeanEngine.register(Class.forName("com.cpiz.loanassistant.cloud.CloudKt"))

        if (System.getenv("LEANCLOUD_APP_ENV") == "development") {
            // 打开 debug 日志
            AVOSCloud.setDebugLogEnabled(true)

            // 如果是开发环境,则设置 AVCloud.callFunction 和 AVCloud.rpcFunction 调用本地云函数实现
            // 如果需要本地开发时调用云端云函数实现,则注释掉下面语句。
            LeanEngine.setLocalEngineCallEnabled(true)
        }
    }

    companion object {
        private val logger = LogManager.getLogger(AppInitListener::class.java)
    }
}

3. 开始使用Kotlin写云函数

package com.cpiz.loanassistant.cloud

import cn.leancloud.EngineFunction
import cn.leancloud.EngineFunctionParam
import ......

/**
* 测试云函数
*/
@EngineFunction
fun hello(): String {
    return "Hello world!"
}

至此结束,原本的目的只是想让算法那部分直接用Kotlin的实现,但最终做到了使用Kotlin编写整个项目,开发效率可比Java高多了。

Comments
Write a Comment