跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 有用 kotlin 开发后端的老哥吗
未分類
31 3 月 2021

有用 kotlin 开发后端的老哥吗

有用 kotlin 开发后端的老哥吗

資深大佬 : mygreens 4

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

大佬有話說 (55)

  • 資深大佬 : rust

    公司一个小项目用了 Ktor,开发确实爽,目前还没有发现什么问题.

  • 資深大佬 : xuanbg

    自从 get 了终极秘技 cv 大法,Java 语言啰嗦繁琐的弱点也就不存在了,反倒是隐隐成了优势。所以 kotlin 什么的也就没有吸引力了

  • 資深大佬 : zoharSoul

    有, json 序列化建议用 gson, 和 kt 配合的资料比较多

  • 資深大佬 : yazinnnn

    json 现在在用 moshi

    用 kotlin 可以尝试一下其他东西,比如 quarkus vertx 啥的

  • 資深大佬 : micean

    兼容旧系统的话,带问号是必要的。
    所有的 pojo 用 IDEA 自带的.java 转.kt 就行
    kotlin 目前最主要的问题在于 debug 反编译依赖 source,异常打印 stack 的行号不那么准

  • 資深大佬 : zerofancy

    毕设项目都是 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

    两年前小公司用的纯 kotlin 后端 开发的 web 后台 / 小程序后台 用起来还是很爽的 没啥特别的坑 或者没怎么遇到

  • 資深大佬 : hantsy

    你多少年没用 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

    你不觉得 fastJson 比较坑。。。

  • 資深大佬 : wellsc

    借问一个 kotlin 的 protobuf grpc 的库

  • 資深大佬 : hantsy

    @zerofancy Spring Data 一般中 Template, repository 都有写 Kotlin 扩展。估计那 GridFsTemplate 没有处理。

  • 資深大佬 : hantsy

    @optional 在 Spring 3 。x 就开始提供了内容协商机制,为什么要用 FastJSON 这种东西???实在不明白。

  • 資深大佬 : ChangQin

    @rust ktor+1

  • 資深大佬 : zoharSoul

    @zerofancy gridFsTemplate.findOne 返回的是 nullable 的吗?

  • 資深大佬 : loshine1992

    用 moshi 或 kotlin-serialization

  • 資深大佬 : xmumiffy

    建议换掉 fastjson
    另外也可以混用 java 至少我这 data class 都是用 java 的,kotlin 的 data class 非常不好用

  • 資深大佬 : Kasumi20

    没有发现 Kotlin 不支持 IoC 和 AOP,所以 Kotlin 和 Spring 百分百兼容。
    至于什么反序列化的如果是先构造一个空对象,当然会有问题。

  • 資深大佬 : boris93

    正在用 Kotlin+Spring Boot+Webflux
    json 序列化反序列化用的 jackson
    目前没啥问题

    话说干嘛要用 fastjson 呢?框架自己序列化反序列化用自带的 jackson 就行了啊,也就稍微配置一下的事
    偶尔用 gson 也能搞定

  • 資深大佬 : youngxhui

    @wellsc grpc 官方有的

  • 資深大佬 : wellsc

    @youngxhui protobuf 我没找到好用的

  • 資深大佬 : bthulu

    fastjson 比 jackson 好用一万倍啊, 为什么要用 jackson, 到处 try catch 很爽吗?

  • 資深大佬 : Evrins

    我试过 kotlin 和 java 一起混用,编译起来太慢了,我又转回去了

  • 資深大佬 : GuoDuanLZ

    @wellsc https://github.com/ButterCam/sisyphus 可以看下这个

  • 資深大佬 : Xbluer

    @bthulu fastjson 动不动就爆漏洞啊

  • 主 資深大佬 : mygreens

    @Xbluer 个人认为 fastjson 还是同类最顺手了。漏洞不用 AutoType 就好了。

  • 資深大佬 : unco020511

    我觉得后端用 kotlin 可能收益不高

  • 資深大佬 : ymmud

    干脆上 scala 得啦,抛弃 spring

  • 資深大佬 : bthulu

    @Xbluer jackson 不一样爆么, fastjson 用的人多, 爆的自然就多, 这不很正常么.
    再说这么多漏洞爆来爆去, 大多不都是 autotype 引起的, jackson 不也因为 autotype 爆过好几次漏洞.
    关掉 autotype 不就好了.

  • 資深大佬 : wellsc

    @GuoDuanLZ 25 个星星的还是算了吧

  • 資深大佬 : boris93

    @bthulu #21 我们是让框架自己处理序列化和反序列化,通常情况自己不手动序列化 json
    偶尔手动序列化就用 gson,就算用 jackson 也就随手 try catch 一下,没啥费劲的
    主要是,不用担心跟 kotlin 的兼容问题,就这一点就比别的强两万倍

  • 資深大佬 : tabris17

    kotlin 协程搭配 vertx,很香

  • 資深大佬 : wupher

    有,自己负责的主力项目,后端业已全迁移至 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

    @Kasumi20 我有一个项目是 Java 和 kotlin 混用的。Java 写的 aop 可以切到 kotlin 的代码。

  • 資深大佬 : sagaxu

    fastjson 你都用了,还有什么不敢用的?

  • 資深大佬 : iseki

    你不觉得坑掉的是 fastjson 吗,fastjson 啥情况我不知道,Jackson 有 Kotlin 模块。
    Jackson 兼容性,可配置性都远胜于 fastjson,至于有人嫌弃 API 不好看…都用 Kotlin 了就不会自己包一下吗

  • 資深大佬 : iseki

    目前 springboot+纯 Kotlin,也不存在必须可空的问题,Jackson 和 spring 都能自动处理好。
    唯一一点问题是项目中其他人用 Java 是,他们不喜欢 Kotlin data class…不可变+构造函数传参他们嫌麻烦

  • 資深大佬 : charlie21

    若你是招聘方:Kotlin 好 Kotlin 棒 Kotlin 是未来趋势 赶快给我招几个一起用 Kotlin 的小伙伴来 我们一起飞
    若你是应聘方: 岗位数 Java : Kotlin = 100 : 1 Kotlin 你学去吧 哈哈 赶紧降低一下 Java 的竞争压力

  • 資深大佬 : charlie21

    这两方逻辑都是完整闭环的,看你站在哪一边而已

  • 資深大佬 : viakiba

    要是能用到 kotlin 的协程还是不错的 要是用不到其实没必要用

  • 資深大佬 : viakiba

    @tabris17 再加上 ignite

  • 資深大佬 : peihuan

    基本无大坑。
    kotlin + vertx 爽到爆。
    新开的 spring 项目也都用 kotlin 写,代码行数能减少很多

  • 資深大佬 : hantsy

    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

    @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

    @peihuan 上面 L103 行, 这种有什么好方法把它解决掉。

  • 資深大佬 : iseki

    @charlie21 头一次听说学 kt 不学 Java 的

  • 資深大佬 : hantsy

    @iseki Kotlin Immutable 类使用上这个是习惯问题。

    写过 Kotlin 后,现在回到 Java, 我也比较喜欢 Constructor Injection ( Spring 4 支持自动注入依赖,如果类只有唯一 历非空参数 constructor ),结合 Lombok,直接声明成 final,使用 @RequiredArg 。。。,省掉了 constructor 。
    另外 Dto (这个模式本来就是用于不可变的场景),也开始习惯了 of factory 方法构建,变成意义上的不可变。

  • 資深大佬 : dai875939260

    @hantsy #44 内部应该是没有,可以写 extension

  • 資深大佬 : bthulu

    @boris93 你这轻量级使用, 或者纯框架用用, 那用啥都行, 反正也没几行代码. 等你碰到需要大量手写序列化反序列化的时候, 你就知道使用 fastjson 的工作量少的不是一星半点了. jackson 各种配置各种 try catch, fastjson 开箱即用.

  • 資深大佬 : lixm

    没发现 jackson 的语法有什么缺陷的, 和 kotlin 配合也很好,kotlin 作为后端开发也是非常爽的,但是没见过会 kotlin 而不会 java 的

  • 資深大佬 : Narcissu5

    我感觉很多人喜欢 fastjson 只是因为它提供了静态方法,然而静态方法是反 OOP 的。。。

    而且因为 fastjson 的漏洞我们几个月之类升级了三次版本,每次几十个微服务都需要升级简直不要太酸爽。可能很多创业公司不会太在意安全问题,等招牌大了分分钟被搞事情。

  • 資深大佬 : sdushn

    @xuanbg cv 工程师

  • 資深大佬 : ZeroDu

    fastjson 序列化 map,key 如果为数字,结果就直接就是数字。{1:”v”}

  • 資深大佬 : jerray

    别说 kotlin 了,之前遇到个公司的构建系统只支持 maven 。我问能不能支持下 gradle,人家说不支持客户端编译。

  • 資深大佬 : hantsy

    @dai875939260 之前尝试过写 Extension,一般 Extension 都是纯 Fun 就行了。Coroutine 这个比较诡异,需要 CoroutineScope 支持才行。

  • 資深大佬 : boris93

    @bthulu #48 轻量级使用……我不知道你是怎么得出这个结论的……
    我司一堆服务每天处理来自全球的不计其数的账号业务,和日均四五万个订单,还有旁路的欺诈检测等等,都没用 fastjson,也没啥需要手写序列化的需求
    其实我倒是很好奇,什么需求需要手动序列化?

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具