不确定如何最好地解释问题,所以我提出了与java和kotlin相同的代码以更好地演示.
当我读取JSON时,它似乎强制数据bean值为NULL,即使该参数甚至不是json的一部分,并且数据bean默认为缺少字段的值.在java中,它正常工作,从不尝试使从未提供的值无效.在Kotlin它似乎打破了因为它试图使一个不可空的字段无效.
在科特林
data class Pojo(val name: String, val age: Int, val list: List<String> = emptyList(), val ts: Date = Date())
private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule())
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
fun main(args: Array<String>) {
mapper.readValue("""{"name": "John Doe", "list": ["yellow", "green"], "age": 42}""", Pojo::class.java)
}
Run Code Online (Sandbox Code Playgroud)
这引发了例外
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Pojo.<init>, parameter ts
Run Code Online (Sandbox Code Playgroud)
在Java(一切正常)
public class Transform {
private static ObjectMapper mapper = new ObjectMapper()
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
public static class Pojo {
private String name;
private int age;
private List<String> …Run Code Online (Sandbox Code Playgroud) 我正在尝试为kotlin 1.0.3的Web框架编写一个很好的Kotlin包装器.在那里我试图将一个函数混合到请求中,让它通过使用jackson的JSON转换返回一个bean.
所以在我的图书馆里,我有以下内容
private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule())
fun <T : Any> Request.asDataBean(type: KClass<T>): T = mapper.readValue(this.body(), type.java)
Run Code Online (Sandbox Code Playgroud)
但是当我转到使用代码时
post("/hello", { req, res ->
val bean = req.asDataBean(TestBean::class)
})
Run Code Online (Sandbox Code Playgroud)
它错误地说bean的期望值是Any.我想要的是我的API如上所述工作,其中传递给asDataBean方法的通用"类"定义是返回的值的类型.
我也试过了
fun <T> Request.asDataBean(type: KClass<*>): T = mapper.readValue(this.body(), type.java) as T
Run Code Online (Sandbox Code Playgroud)
以及将使用代码更改为
val bean: TestBean = req.asDataBean(TestBean::class)
Run Code Online (Sandbox Code Playgroud)
希望使它工作,但他们在使用代码时也会给出完全相同的错误.
我如何使用传入的类类型定义的泛型作为参数(非常类似于所有spring api在java中的工作方式)?
创建了一个测试用例以尝试表示我要执行的操作。我无法弄清楚如何“停止”继续在匿名函数中进行工作。在下面的示例中,如果答案正确,我想突破“苹果”部分。下面的代码无法编译,因为它说的是return @ apple而不是return @ banana,这是唯一有效的选项,但是我在下面编写了此代码,以尝试解释我要实现的目标并更好地理解如何进行类似的操作这个。
class FunctionBreakingTest {
@Test fun stopInMiddleOfLambda() {
var answer = "wrong"
doStuff apple@ {
doStuff banana@ {
answer = "correct"
if (answer == "correct") {
return@apple
}
answer = "wrong"
}
answer = "wrong"
}
assertEquals("correct", answer)
}
private fun doStuff(foo: () -> Unit) = foo.invoke()
}
Run Code Online (Sandbox Code Playgroud)