有用 kotlin 开发后端的老哥吗

2021-03-31 10:54:29 +08:00
 mygreens

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

7969 次点击
所在节点    Java
55 条回复
rust
2021-03-31 10:57:42 +08:00
公司一个小项目用了 Ktor,开发确实爽,目前还没有发现什么问题.
xuanbg
2021-03-31 10:59:57 +08:00
自从 get 了终极秘技 cv 大法,Java 语言啰嗦繁琐的弱点也就不存在了,反倒是隐隐成了优势。所以 kotlin 什么的也就没有吸引力了
zoharSoul
2021-03-31 11:02:15 +08:00
有, json 序列化建议用 gson, 和 kt 配合的资料比较多
yazinnnn
2021-03-31 11:02:51 +08:00
json 现在在用 moshi

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

话说干嘛要用 fastjson 呢?框架自己序列化反序列化用自带的 jackson 就行了啊,也就稍微配置一下的事
偶尔用 gson 也能搞定
youngxhui
2021-03-31 12:43:38 +08:00
@wellsc grpc 官方有的
wellsc
2021-03-31 13:00:48 +08:00
@youngxhui protobuf 我没找到好用的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX