目前只敢工具类用 kotlin,不知道 kotlin 和 spring 会不会有兼容上的坑,兼容 spring 各种注解么。 目前发现比较难受的是,数据类(DO, DTO)必须全部用可空,不然 fastjson 反序列化会有问题。 有生产环境用 kotlin 开发的老哥吗,目前有什么问题?
1
rust 2021-03-31 10:57:42 +08:00
公司一个小项目用了 Ktor,开发确实爽,目前还没有发现什么问题.
|
2
xuanbg 2021-03-31 10:59:57 +08:00
自从 get 了终极秘技 cv 大法,Java 语言啰嗦繁琐的弱点也就不存在了,反倒是隐隐成了优势。所以 kotlin 什么的也就没有吸引力了
|
3
zoharSoul 2021-03-31 11:02:15 +08:00
有, json 序列化建议用 gson, 和 kt 配合的资料比较多
|
4
yazinnnn 2021-03-31 11:02:51 +08:00
json 现在在用 moshi
用 kotlin 可以尝试一下其他东西,比如 quarkus vertx 啥的 |
5
micean 2021-03-31 11:10:14 +08:00
兼容旧系统的话,带问号是必要的。
所有的 pojo 用 IDEA 自带的.java 转.kt 就行 kotlin 目前最主要的问题在于 debug 反编译依赖 source,异常打印 stack 的行号不那么准 |
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 } ``` |
7
anke1938 2021-03-31 11:15:39 +08:00
两年前小公司用的纯 kotlin 后端 开发的 web 后台 / 小程序后台 用起来还是很爽的 没啥特别的坑 或者没怎么遇到
|
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 |
9
optional 2021-03-31 11:19:03 +08:00 via iPhone 2
你不觉得 fastJson 比较坑。。。
|
10
wellsc 2021-03-31 11:20:10 +08:00
借楼问一个 kotlin 的 protobuf grpc 的库
|
11
hantsy 2021-03-31 11:20:40 +08:00
@zerofancy Spring Data 一般中 Template, repository 都有写 Kotlin 扩展。估计那 GridFsTemplate 没有处理。
|
12
hantsy 2021-03-31 11:22:16 +08:00
@optional 在 Spring 3 。x 就开始提供了内容协商机制,为什么要用 FastJSON 这种东西???实在不明白。
|
15
loshine1992 2021-03-31 12:10:04 +08:00
用 moshi 或 kotlin-serialization
|
16
xmumiffy 2021-03-31 12:14:02 +08:00 via Android
建议换掉 fastjson
另外也可以混用 java 至少我这 data class 都是用 java 的,kotlin 的 data class 非常不好用 |
17
Kasumi20 2021-03-31 12:28:09 +08:00
没有发现 Kotlin 不支持 IoC 和 AOP,所以 Kotlin 和 Spring 百分百兼容。
至于什么反序列化的如果是先构造一个空对象,当然会有问题。 |
18
boris93 2021-03-31 12:35:46 +08:00 via iPhone
正在用 Kotlin+Spring Boot+Webflux
json 序列化反序列化用的 jackson 目前没啥问题 话说干嘛要用 fastjson 呢?框架自己序列化反序列化用自带的 jackson 就行了啊,也就稍微配置一下的事 偶尔用 gson 也能搞定 |
21
bthulu 2021-03-31 13:53:24 +08:00 1
fastjson 比 jackson 好用一万倍啊, 为什么要用 jackson, 到处 try catch 很爽吗?
|
22
Evrins 2021-03-31 14:15:21 +08:00
我试过 kotlin 和 java 一起混用,编译起来太慢了,我又转回去了
|
23
GuoDuanLZ 2021-03-31 14:18:19 +08:00
|
26
unco020511 2021-03-31 15:17:20 +08:00
我觉得后端用 kotlin 可能收益不高
|
27
ymmud 2021-03-31 15:50:11 +08:00
干脆上 scala 得啦,抛弃 spring
|
28
bthulu 2021-03-31 15:50:33 +08:00
@Xbluer jackson 不一样爆么, fastjson 用的人多, 爆的自然就多, 这不很正常么.
再说这么多漏洞爆来爆去, 大多不都是 autotype 引起的, jackson 不也因为 autotype 爆过好几次漏洞. 关掉 autotype 不就好了. |
30
boris93 2021-03-31 17:27:42 +08:00 via iPhone
@bthulu #21 我们是让框架自己处理序列化和反序列化,通常情况自己不手动序列化 json
偶尔手动序列化就用 gson,就算用 jackson 也就随手 try catch 一下,没啥费劲的 主要是,不用担心跟 kotlin 的兼容问题,就这一点就比别的强两万倍 |
31
tabris17 2021-03-31 17:43:31 +08:00
kotlin 协程搭配 vertx,很香
|
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 |
33
mmdsun 2021-03-31 18:48:14 +08:00 via Android
@Kasumi20 我有一个项目是 Java 和 kotlin 混用的。Java 写的 aop 可以切到 kotlin 的代码。
|
34
sagaxu 2021-03-31 18:55:39 +08:00 via Android 1
fastjson 你都用了,还有什么不敢用的?
|
35
iseki 2021-03-31 18:57:32 +08:00 via Android
你不觉得坑掉的是 fastjson 吗,fastjson 啥情况我不知道,Jackson 有 Kotlin 模块。
Jackson 兼容性,可配置性都远胜于 fastjson,至于有人嫌弃 API 不好看…都用 Kotlin 了就不会自己包一下吗😆 |
36
iseki 2021-03-31 19:00:10 +08:00 via Android
目前 springboot+纯 Kotlin,也不存在必须可空的问题,Jackson 和 spring 都能自动处理好。
唯一一点问题是项目中其他人用 Java 是,他们不喜欢 Kotlin data class…不可变+构造函数传参他们嫌麻烦😅 |
37
charlie21 2021-03-31 21:41:02 +08:00
若你是招聘方:Kotlin 好 Kotlin 棒 Kotlin 是未来趋势 赶快给我招几个一起用 Kotlin 的小伙伴来 我们一起飞
若你是应聘方: 岗位数 Java : Kotlin = 100 : 1 Kotlin 你学去吧 哈哈 赶紧降低一下 Java 的竞争压力 |
38
charlie21 2021-03-31 21:41:49 +08:00
这两方逻辑都是完整闭环的,看你站在哪一边而已
|
39
viakiba 2021-03-31 23:33:21 +08:00 via iPhone
要是能用到 kotlin 的协程还是不错的 要是用不到其实没必要用
|
41
peihuan 2021-03-31 23:37:35 +08:00
基本无大坑。
kotlin + vertx 爽到爆。 新开的 spring 项目也都用 kotlin 写,代码行数能减少很多 |
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 。 |
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 |
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 方法构建,变成意义上的不可变。 |
47
dai875939260 2021-04-01 08:38:52 +08:00
@hantsy #44 内部应该是没有,可以写 extension
|
48
bthulu 2021-04-01 08:48:18 +08:00
@boris93 你这轻量级使用, 或者纯框架用用, 那用啥都行, 反正也没几行代码. 等你碰到需要大量手写序列化反序列化的时候, 你就知道使用 fastjson 的工作量少的不是一星半点了. jackson 各种配置各种 try catch, fastjson 开箱即用.
|
49
lixm 2021-04-01 09:14:59 +08:00
没发现 jackson 的语法有什么缺陷的, 和 kotlin 配合也很好,kotlin 作为后端开发也是非常爽的,但是没见过会 kotlin 而不会 java 的
|
50
Narcissu5 2021-04-01 09:41:42 +08:00
我感觉很多人喜欢 fastjson 只是因为它提供了静态方法,然而静态方法是反 OOP 的。。。
而且因为 fastjson 的漏洞我们几个月之类升级了三次版本,每次几十个微服务都需要升级简直不要太酸爽。可能很多创业公司不会太在意安全问题,等招牌大了分分钟被搞事情。 |
52
ZeroDu 2021-04-01 10:04:31 +08:00
fastjson 序列化 map,key 如果为数字,结果就直接就是数字。{1:"v"}
|
53
jerray 2021-04-01 10:44:01 +08:00
别说 kotlin 了,之前遇到个公司的构建系统只支持 maven 。我问能不能支持下 gradle,人家说不支持客户端编译。
|
54
hantsy 2021-04-01 11:50:03 +08:00
@dai875939260 之前尝试过写 Extension,一般 Extension 都是纯 Fun 就行了。Coroutine 这个比较诡异,需要 CoroutineScope 支持才行。
|