有用 kotlin 开发后端的老哥吗 - V2EX
mygreens
V2EX    Java

有用 kotlin 开发后端的老哥吗

  •  1
     
  •   mygreens Mar 31, 2021 9070 views
    This topic created in 1877 days ago, the information mentioned may be changed or developed.

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

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

    用 kotlin 可以尝试一下其他东西,比如 quarkus vertx 啥的
    micean
        5
    micean  
       Mar 31, 2021
    兼容旧系统的话,带问号是必要的。
    所有的 pojo 用 IDEA 自带的.java 转.kt 就行
    kotlin 目前最主要的问题在于 debug 反编译依赖 source,异常打印 stack 的行号不那么准
    zerofancy
        6
    zerofancy  
       Mar 31, 2021
    毕设项目都是 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  
       Mar 31, 2021
    两年前小公司用的纯 kotlin 后端 开发的 web 后台 / 小程序后台 用起来还是很爽的 没啥特别的坑 或者没怎么遇到
    hantsy
        8
    hantsy  
       Mar 31, 2021   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  
       Mar 31, 2021 via iPhone   2
    你不觉得 fastJson 比较坑。。。
    wellsc
        10
    wellsc  
       Mar 31, 2021
    借楼问一个 kotlin 的 protobuf grpc 的库
    hantsy
        11
    hantsy  
       Mar 31, 2021
    @zerofancy Spring Data 一般中 Template, repository 都有写 Kotlin 扩展。估计那 GridFsTemplate 没有处理。
    hantsy
        12
    hantsy  
       Mar 31, 2021
    @optional 在 Spring 3 。x 就开始提供了内容协商机制,为什么要用 FastJSON 这种东西???实在不明白。
    ChangQin
        13
    ChangQin  
       Mar 31, 2021 via iPhone
    @rust ktor+1
    zoharSoul
        14
    zoharSoul  
       Mar 31, 2021
    @zerofancy gridFsTemplate.findOne 返回的是 nullable 的吗?
    loshine1992
        15
    loshine1992  
       Mar 31, 2021
    用 moshi 或 kotlin-serialization
    106npo
        16
    106npo  
       Mar 31, 2021 via Android
    建议换掉 fastjson
    另外也可以混用 java 至少我这 data class 都是用 java 的,kotlin 的 data class 非常不好用
    Kasumi20
        17
    Kasumi20  
       Mar 31, 2021
    没有发现 Kotlin 不支持 IoC 和 AOP,所以 Kotlin 和 Spring 百分百兼容。
    至于什么反序列化的如果是先构造一个空对象,当然会有问题。
    boris93
        18
    boris93  
       Mar 31, 2021 via iPhone
    正在用 Kotlin+Spring Boot+Webflux
    json 序列化反序列化用的 jackson
    目前没啥问题

    话说干嘛要用 fastjson 呢?框架自己序列化反序列化用自带的 jackson 就行了啊,也就稍微配置一下的事
    偶尔用 gson 也能搞定
    youngxhui
        19
    youngxhui  
       Mar 31, 2021 via Android
    @wellsc grpc 官方有的
    wellsc
        20
    wellsc  
       Mar 31, 2021 via iPhone
    @youngxhui protobuf 我没找到好用的
    bthulu
        21
    bthulu  
       Mar 31, 2021   1
    fastjson 比 jackson 好用一万倍啊, 为什么要用 jackson, 到处 try catch 很爽吗?
    Evrins
        22
    Evrins  
       Mar 31, 2021
    我试过 kotlin 和 java 一起混用,编译起来太慢了,我又转回去了
    GuoDuanLZ
        23
    GuoDuanLZ  
       Mar 31, 2021
    Xbluer
        24
    Xbluer  
       Mar 31, 2021
    @bthulu fastjson 动不动就爆漏洞啊
    mygreens
        25
    mygreens  
    OP
       Mar 31, 2021
    @Xbluer 个人认为 fastjson 还是同类最顺手了。漏洞不用 AutoType 就好了。
    unco020511
        26
    unco020511  
       Mar 31, 2021
    我觉得后端用 kotlin 可能收益不高
    ymmud
        27
    ymmud  
       Mar 31, 2021
    干脆上 scala 得啦,抛弃 spring
    bthulu
        28
    bthulu  
       Mar 31, 2021
    @Xbluer jackson 不一样爆么, fastjson 用的人多, 爆的自然就多, 这不很正常么.
    再说这么多漏洞爆来爆去, 大多不都是 autotype 引起的, jackson 不也因为 autotype 爆过好几次漏洞.
    关掉 autotype 不就好了.
    wellsc
        29
    wellsc  
       Mar 31, 2021 via iPhone
    @GuoDuanLZ 25 个星星的还是算了吧
    boris93
        30
    boris93  
       Mar 31, 2021 via iPhone
    @bthulu #21 我们是让框架自己处理序列化和反序列化,通常情况自己不手动序列化 json
    偶尔手动序列化就用 gson,就算用 jackson 也就随手 try catch 一下,没啥费劲的
    主要是,不用担心跟 kotlin 的兼容问题,就这一点就比别的强两万倍
    tabris17
        31
    tabris17  
       Mar 31, 2021
    kotlin 协程搭配 vertx,很香
    wupher
        32
    wupher  
       Mar 31, 2021
    有,自己负责的主力项目,后端业已全迁移至 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  
       Mar 31, 2021 via Android
    @Kasumi20 我有一个项目是 Java 和 kotlin 混用的。Java 写的 aop 可以切到 kotlin 的代码。
    sagaxu
        34
    sagaxu  
       Mar 31, 2021 via Android   1
    fastjson 你都用了,还有什么不敢用的?
    iseki
        35
    iseki  
       Mar 31, 2021 via Android
    你不觉得坑掉的是 fastjson 吗,fastjson 啥情况我不知道,Jackson 有 Kotlin 模块。
    Jackson 兼容性,可配置性都远胜于 fastjson,至于有人嫌弃 API 不好看…都用 Kotlin 了就不会自己包一下吗
    iseki
        36
    iseki  
       Mar 31, 2021 via Android
    目前 springboot+纯 Kotlin,也不存在必须可空的问题,Jackson 和 spring 都能自动处理好。
    唯一一点问题是项目中其他人用 Java 是,他们不喜欢 Kotlin data class…不可变+构造函数传参他们嫌麻烦
    charlie21
        37
    charlie21  
       Mar 31, 2021
    若你是招聘方:Kotlin 好 Kotlin 棒 Kotlin 是未来趋势 赶快给我招几个一起用 Kotlin 的小伙伴来 我们一起飞
    若你是应聘方: 岗位数 Java : Kotlin = 100 : 1 Kotlin 你学去吧 哈哈 赶紧降低一下 Java 的竞争压力
    charlie21
        38
    charlie21  
       Mar 31, 2021
    这两方逻辑都是完整闭环的,看你站在哪一边而已
    viakiba
        39
    viakiba  
       Mar 31, 2021 via iPhone
    要是能用到 kotlin 的协程还是不错的 要是用不到其实没必要用
    viakiba
        40
    viakiba  
       Mar 31, 2021 via iPhone
    @tabris17 再加上 ignite
    peihuan
        41
    peihuan  
       Mar 31, 2021
    基本无大坑。
    kotlin + vertx 爽到爆。
    新开的 spring 项目也都用 kotlin 写,代码行数能减少很多
    hantsy
        42
    hantsy  
       Mar 31, 2021
    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  
       Mar 31, 2021
    @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  
       Mar 31, 2021
    @peihuan 上面 L103 行, 这种有什么好方法把它解决掉。
    iseki
        45
    iseki  
       Apr 1, 2021 via Android
    @charlie21 头一次听说学 kt 不学 Java 的
    hantsy
        46
    hantsy  
       Apr 1, 2021
    @iseki Kotlin Immutable 类使用上这个是习惯问题。

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

    而且因为 fastjson 的漏洞我们几个月之类升级了三次版本,每次几十个微服务都需要升级简直不要太酸爽。可能很多创业公司不会太在意安全问题,等招牌大了分分钟被搞事情。
    sdushn
        51
    sdushn  
       Apr 1, 2021
    @xuanbg cv 工程师
    ZeroDu
        52
    ZeroDu  
       Apr 1, 2021
    fastjson 序列化 map,key 如果为数字,结果就直接就是数字。{1:"v"}
    jerray
        53
    jerray  
       Apr 1, 2021
    别说 kotlin 了,之前遇到个公司的构建系统只支持 maven 。我问能不能支持下 gradle,人家说不支持客户端编译。
    hantsy
        54
    hantsy  
       Apr 1, 2021
    @dai875939260 之前尝试过写 Extension,一般 Extension 都是纯 Fun 就行了。Coroutine 这个比较诡异,需要 CoroutineScope 支持才行。
    boris93
        55
    boris93  
       Apr 1, 2021 via iPhone
    @bthulu #48 轻量级使用……我不知道你是怎么得出这个结论的……
    我司一堆服务每天处理来自全球的不计其数的账号业务,和日均四五万个订单,还有旁路的欺诈检测等等,都没用 fastjson,也没啥需要手写序列化的需求
    其实我倒是很好奇,什么需求需要手动序列化?
    About     Help     Advertise     Blog     API     FAQ     Solana     5761 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 121ms UTC 06:23 PVG 14:23 LAX 23:23 JFK 02:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86