V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mygreens
V2EX  ›  Java

有用 kotlin 开发后端的老哥吗

  •  1
     
  •   mygreens · 2021-03-31 10:54:29 +08:00 · 8016 次点击
    这是一个创建于 1368 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前只敢工具类用 kotlin,不知道 kotlin 和 spring 会不会有兼容上的坑,兼容 spring 各种注解么。 目前发现比较难受的是,数据类(DO, DTO)必须全部用可空,不然 fastjson 反序列化会有问题。 有生产环境用 kotlin 开发的老哥吗,目前有什么问题?

    第 1 条附言  ·  2021-03-31 15:05:32 +08:00
    感谢各位大佬,这么看还是有点坑的。个人意见,相比安卓,后端上 kotlin 收益真的不大。
    spring 本身已经包装了大量的设计模式,后端对 npe 的容忍度也比较高,kotlin 基本都是当语法糖在用,所以目前还是不踩坑了。
    55 条回复    2021-04-01 13:00:44 +08:00
    rust
        1
    rust  
       2021-03-31 10:57:42 +08:00
    公司一个小项目用了 Ktor,开发确实爽,目前还没有发现什么问题.
    xuanbg
        2
    xuanbg  
       2021-03-31 10:59:57 +08:00
    自从 get 了终极秘技 cv 大法,Java 语言啰嗦繁琐的弱点也就不存在了,反倒是隐隐成了优势。所以 kotlin 什么的也就没有吸引力了
    zoharSoul
        3
    zoharSoul  
       2021-03-31 11:02:15 +08:00
    有, json 序列化建议用 gson, 和 kt 配合的资料比较多
    yazinnnn
        4
    yazinnnn  
       2021-03-31 11:02:51 +08:00
    json 现在在用 moshi

    用 kotlin 可以尝试一下其他东西,比如 quarkus vertx 啥的
    micean
        5
    micean  
       2021-03-31 11:10:14 +08:00
    兼容旧系统的话,带问号是必要的。
    所有的 pojo 用 IDEA 自带的.java 转.kt 就行
    kotlin 目前最主要的问题在于 debug 反编译依赖 source,异常打印 stack 的行号不那么准
    zerofancy
        6
    zerofancy  
       2021-03-31 11:14:56 +08:00
    毕设项目都是 Kotlin,目前遇到过两个奇怪的问题。

    1. 同时有 Java 和 Kotlin 的 RestController,Java 的找不到
    2. 类型推断好像有点问题

    有如下代码:

    ```kt
    val gridFsFile: GridFSFile? = gridFsTemplate.findOne(Query(Criteria.where("_id").`is`(id)))
    ```

    idea 提示我

    ```
    'gridFsFile' is always non-null type
    ```

    很明显 gridFsTemplate 是可空的,甚至在接口 GridFsOperations 中已经标注了 @Nullable
    尝试加入判空逻辑:

    ```
    if (gridFsFile == null) {
    // do something
    }
    ```

    idea 提示:

    ```
    No method 'equals(Any?): Boolean' available
    ```

    猜想是不是 Kotlin 调用 java 都会有这样问题,结果未能在 demo 项目中复现。
    目前用这样的方式判断,原理不明:

    ```kt
    if (gridFsFile === null) {
    // do something
    }
    ```
    anke1938
        7
    anke1938  
       2021-03-31 11:15:39 +08:00
    两年前小公司用的纯 kotlin 后端 开发的 web 后台 / 小程序后台 用起来还是很爽的 没啥特别的坑 或者没怎么遇到
    hantsy
        8
    hantsy  
       2021-03-31 11:17:57 +08:00   ❤️ 1
    你多少年没用 Spring 了?

    Spring 5.0(2017 年) 开始, 除了 Reactive,Kotlin 就是最重要的特性之一,Spring 对 Kotlin 进行深度集成(远超过之差的 Groovy 语言支持)。针对很多 Kotlin 特性很多优化,例如,不必声明 open, data class 可以用于 JPA Entity 等。

    Kotlin DSL 声明 beans 定义,安全 (参考 Spring 中 BeanDefinitionDSL )等。

    val beans = beans {
    bean {
    CommandLineRunner {
    println("start data initialization...")
    val posts = ref<PostRepository>()
    posts.deleteAll()
    .thenMany<Post>(
    posts.saveAll(
    arrayListOf(
    Post(null, "my first post", "content of my first post"),
    Post(null, "my second post", "content of my second post")
    )
    )
    )
    .log()
    .subscribe(
    { println(it) },
    { println(it) },
    { println("data initialization done...") }
    )
    }
    }

    https://github.com/hantsy/spring-kotlin-dsl-sample/blob/master/reactive/src/main/kotlin/com/example/demo/DemoApplication.kt

    现在 Spring 还有一个 Spring Kofu 孵化项目(提供完全 Kotlin DSL )。

    val app = reactiveWebApplication {
    configurationProperties<SampleProperties>(prefix = "sample")
    enable(dataConfig)
    enable(webConfig)

    listener<ApplicationReadyEvent> {
    println("start data initialization...")
    ref<PostRepository>().init()
    }
    profile("foo") {
    beans { bean<Bar>() }
    }
    }

    https://github.com/hantsy/spring-kotlin-dsl-sample/blob/master/kofu-reactive-mongo/src/main/kotlin/com/example/demo/DemoApplication.kt
    optional
        9
    optional  
       2021-03-31 11:19:03 +08:00 via iPhone   ❤️ 2
    你不觉得 fastJson 比较坑。。。
    wellsc
        10
    wellsc  
       2021-03-31 11:20:10 +08:00
    借楼问一个 kotlin 的 protobuf grpc 的库
    hantsy
        11
    hantsy  
       2021-03-31 11:20:40 +08:00
    @zerofancy Spring Data 一般中 Template, repository 都有写 Kotlin 扩展。估计那 GridFsTemplate 没有处理。
    hantsy
        12
    hantsy  
       2021-03-31 11:22:16 +08:00
    @optional 在 Spring 3 。x 就开始提供了内容协商机制,为什么要用 FastJSON 这种东西???实在不明白。
    ChangQin
        13
    ChangQin  
       2021-03-31 12:00:36 +08:00 via iPhone
    @rust ktor+1
    zoharSoul
        14
    zoharSoul  
       2021-03-31 12:07:05 +08:00
    @zerofancy gridFsTemplate.findOne 返回的是 nullable 的吗?
    loshine1992
        15
    loshine1992  
       2021-03-31 12:10:04 +08:00
    用 moshi 或 kotlin-serialization
    xmumiffy
        16
    xmumiffy  
       2021-03-31 12:14:02 +08:00 via Android
    建议换掉 fastjson
    另外也可以混用 java 至少我这 data class 都是用 java 的,kotlin 的 data class 非常不好用
    Kasumi20
        17
    Kasumi20  
       2021-03-31 12:28:09 +08:00
    没有发现 Kotlin 不支持 IoC 和 AOP,所以 Kotlin 和 Spring 百分百兼容。
    至于什么反序列化的如果是先构造一个空对象,当然会有问题。
    boris93
        18
    boris93  
       2021-03-31 12:35:46 +08:00 via iPhone
    正在用 Kotlin+Spring Boot+Webflux
    json 序列化反序列化用的 jackson
    目前没啥问题

    话说干嘛要用 fastjson 呢?框架自己序列化反序列化用自带的 jackson 就行了啊,也就稍微配置一下的事
    偶尔用 gson 也能搞定
    youngxhui
        19
    youngxhui  
       2021-03-31 12:43:38 +08:00 via Android
    @wellsc grpc 官方有的
    wellsc
        20
    wellsc  
       2021-03-31 13:00:48 +08:00 via iPhone
    @youngxhui protobuf 我没找到好用的
    bthulu
        21
    bthulu  
       2021-03-31 13:53:24 +08:00   ❤️ 1
    fastjson 比 jackson 好用一万倍啊, 为什么要用 jackson, 到处 try catch 很爽吗?
    Evrins
        22
    Evrins  
       2021-03-31 14:15:21 +08:00
    我试过 kotlin 和 java 一起混用,编译起来太慢了,我又转回去了
    GuoDuanLZ
        23
    GuoDuanLZ  
       2021-03-31 14:18:19 +08:00
    Xbluer
        24
    Xbluer  
       2021-03-31 14:52:25 +08:00
    @bthulu fastjson 动不动就爆漏洞啊
    mygreens
        25
    mygreens  
    OP
       2021-03-31 14:57:29 +08:00
    @Xbluer 个人认为 fastjson 还是同类最顺手了。漏洞不用 AutoType 就好了。
    unco020511
        26
    unco020511  
       2021-03-31 15:17:20 +08:00
    我觉得后端用 kotlin 可能收益不高
    ymmud
        27
    ymmud  
       2021-03-31 15:50:11 +08:00
    干脆上 scala 得啦,抛弃 spring
    bthulu
        28
    bthulu  
       2021-03-31 15:50:33 +08:00
    @Xbluer jackson 不一样爆么, fastjson 用的人多, 爆的自然就多, 这不很正常么.
    再说这么多漏洞爆来爆去, 大多不都是 autotype 引起的, jackson 不也因为 autotype 爆过好几次漏洞.
    关掉 autotype 不就好了.
    wellsc
        29
    wellsc  
       2021-03-31 16:33:31 +08:00 via iPhone
    @GuoDuanLZ 25 个星星的还是算了吧
    boris93
        30
    boris93  
       2021-03-31 17:27:42 +08:00 via iPhone
    @bthulu #21 我们是让框架自己处理序列化和反序列化,通常情况自己不手动序列化 json
    偶尔手动序列化就用 gson,就算用 jackson 也就随手 try catch 一下,没啥费劲的
    主要是,不用担心跟 kotlin 的兼容问题,就这一点就比别的强两万倍
    tabris17
        31
    tabris17  
       2021-03-31 17:43:31 +08:00
    kotlin 协程搭配 vertx,很香
    wupher
        32
    wupher  
       2021-03-31 17:44:52 +08:00
    有,自己负责的主力项目,后端业已全迁移至 Kotlin 。

    Pros: the language, spring/spring boot, Func Programming, even coroutines & kotlin ReactiveX 这些都用过,没碰到过什么大坑

    Cons: Kotlin 的强类型模式,在某些时候会不爽,比如对外接口。Data object 认为 String 就是 String , Int 就是 Int 。但是有可能对端实现变更或者多接一个调用方,应该传 "1" 的变成了 1,kotlin (看具体实现方式)就有可能报错。这种时候,最怀念 Groovy 或者 Ruby,你认为它是 Int 它就是 int,认为它是 string 它就是 string.

    BTW:json 可以考虑使用 moshi 或者 jackson json
    mmdsun
        33
    mmdsun  
       2021-03-31 18:48:14 +08:00 via Android
    @Kasumi20 我有一个项目是 Java 和 kotlin 混用的。Java 写的 aop 可以切到 kotlin 的代码。
    sagaxu
        34
    sagaxu  
       2021-03-31 18:55:39 +08:00 via Android   ❤️ 1
    fastjson 你都用了,还有什么不敢用的?
    iseki
        35
    iseki  
       2021-03-31 18:57:32 +08:00 via Android
    你不觉得坑掉的是 fastjson 吗,fastjson 啥情况我不知道,Jackson 有 Kotlin 模块。
    Jackson 兼容性,可配置性都远胜于 fastjson,至于有人嫌弃 API 不好看…都用 Kotlin 了就不会自己包一下吗😆
    iseki
        36
    iseki  
       2021-03-31 19:00:10 +08:00 via Android
    目前 springboot+纯 Kotlin,也不存在必须可空的问题,Jackson 和 spring 都能自动处理好。
    唯一一点问题是项目中其他人用 Java 是,他们不喜欢 Kotlin data class…不可变+构造函数传参他们嫌麻烦😅
    charlie21
        37
    charlie21  
       2021-03-31 21:41:02 +08:00
    若你是招聘方:Kotlin 好 Kotlin 棒 Kotlin 是未来趋势 赶快给我招几个一起用 Kotlin 的小伙伴来 我们一起飞
    若你是应聘方: 岗位数 Java : Kotlin = 100 : 1 Kotlin 你学去吧 哈哈 赶紧降低一下 Java 的竞争压力
    charlie21
        38
    charlie21  
       2021-03-31 21:41:49 +08:00
    这两方逻辑都是完整闭环的,看你站在哪一边而已
    viakiba
        39
    viakiba  
       2021-03-31 23:33:21 +08:00 via iPhone
    要是能用到 kotlin 的协程还是不错的 要是用不到其实没必要用
    viakiba
        40
    viakiba  
       2021-03-31 23:34:57 +08:00 via iPhone
    @tabris17 再加上 ignite
    peihuan
        41
    peihuan  
       2021-03-31 23:37:35 +08:00
    基本无大坑。
    kotlin + vertx 爽到爆。
    新开的 spring 项目也都用 kotlin 写,代码行数能减少很多
    hantsy
        42
    hantsy  
       2021-03-31 23:50:00 +08:00
    2021 年还有人手动序列化。你们完全不用框架吗?

    如果你用的是 Spring, 写的是 Web API 之类,还在用手动序列化,你的代码估计我看到要吐血。

    手动序列化工具太多了。我觉得 JSONB 标准最简单。https://github.com/hantsy/cargotracker-regapp/blob/master/src/main/java/org/eclipse/cargotrakcer/regapp/client/internal/HttpClientHandlingReportService.java#L64

    只有在一些没有框架支持的情况我才会用到手动序列化,比如上面的 Client 。
    hantsy
        43
    hantsy  
       2021-03-31 23:54:53 +08:00
    @peihuan

    vertx 感觉没那么爽啊,

    https://github.com/hantsy/vertx-sandbox/blob/master/kotlin-co/src/main/kotlin/com/example/demo/MainVerticle.kt#L103

    这种,没有内部 API 支持吗?这个我实在不清楚。

    关于 Jackson 的配置,没有一些接口(方法)暴露出来 , 太不灵活了,我提过 issue,官方回复就是这样的。

    https://github.com/hantsy/vertx-sandbox/blob/master/kotlin-co/src/main/kotlin/com/example/demo/MainVerticle.kt#L42
    hantsy
        44
    hantsy  
       2021-03-31 23:57:38 +08:00
    @peihuan 上面 L103 行, 这种有什么好方法把它解决掉。
    iseki
        45
    iseki  
       2021-04-01 00:21:08 +08:00 via Android
    @charlie21 头一次听说学 kt 不学 Java 的😀
    hantsy
        46
    hantsy  
       2021-04-01 00:37:11 +08:00
    @iseki Kotlin Immutable 类使用上这个是习惯问题。

    写过 Kotlin 后,现在回到 Java, 我也比较喜欢 Constructor Injection ( Spring 4 支持自动注入依赖,如果类只有唯一 历非空参数 constructor ),结合 Lombok,直接声明成 final,使用 @RequiredArg 。。。,省掉了 constructor 。
    另外 Dto (这个模式本来就是用于不可变的场景),也开始习惯了 of factory 方法构建,变成意义上的不可变。
    dai875939260
        47
    dai875939260  
       2021-04-01 08:38:52 +08:00
    @hantsy #44 内部应该是没有,可以写 extension
    bthulu
        48
    bthulu  
       2021-04-01 08:48:18 +08:00
    @boris93 你这轻量级使用, 或者纯框架用用, 那用啥都行, 反正也没几行代码. 等你碰到需要大量手写序列化反序列化的时候, 你就知道使用 fastjson 的工作量少的不是一星半点了. jackson 各种配置各种 try catch, fastjson 开箱即用.
    lixm
        49
    lixm  
       2021-04-01 09:14:59 +08:00
    没发现 jackson 的语法有什么缺陷的, 和 kotlin 配合也很好,kotlin 作为后端开发也是非常爽的,但是没见过会 kotlin 而不会 java 的
    Narcissu5
        50
    Narcissu5  
       2021-04-01 09:41:42 +08:00
    我感觉很多人喜欢 fastjson 只是因为它提供了静态方法,然而静态方法是反 OOP 的。。。

    而且因为 fastjson 的漏洞我们几个月之类升级了三次版本,每次几十个微服务都需要升级简直不要太酸爽。可能很多创业公司不会太在意安全问题,等招牌大了分分钟被搞事情。
    sdushn
        51
    sdushn  
       2021-04-01 09:56:36 +08:00
    @xuanbg cv 工程师
    ZeroDu
        52
    ZeroDu  
       2021-04-01 10:04:31 +08:00
    fastjson 序列化 map,key 如果为数字,结果就直接就是数字。{1:"v"}
    jerray
        53
    jerray  
       2021-04-01 10:44:01 +08:00
    别说 kotlin 了,之前遇到个公司的构建系统只支持 maven 。我问能不能支持下 gradle,人家说不支持客户端编译。
    hantsy
        54
    hantsy  
       2021-04-01 11:50:03 +08:00
    @dai875939260 之前尝试过写 Extension,一般 Extension 都是纯 Fun 就行了。Coroutine 这个比较诡异,需要 CoroutineScope 支持才行。
    boris93
        55
    boris93  
       2021-04-01 13:00:44 +08:00 via iPhone
    @bthulu #48 轻量级使用……我不知道你是怎么得出这个结论的……
    我司一堆服务每天处理来自全球的不计其数的账号业务,和日均四五万个订单,还有旁路的欺诈检测等等,都没用 fastjson,也没啥需要手写序列化的需求
    其实我倒是很好奇,什么需求需要手动序列化?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2653 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:07 · PVG 23:07 · LAX 07:07 · JFK 10:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.