Box Kotlin value class parameters in web endpoint

In order to avoid "java.lang.IllegalArgumentException:
object is not an instance of declaring class" errors.

Closes gh-31698
This commit is contained in:
Sébastien Deleuze
2023-12-08 10:14:13 +01:00
parent b78aed99ea
commit 91b9a75371
4 changed files with 92 additions and 2 deletions

View File

@@ -84,6 +84,20 @@ class InvocableHandlerMethodKotlinTests {
Assertions.assertThat(value).isNull()
}
@Test
fun valueClass() {
composite.addResolver(StubArgumentResolver(Long::class.java, 1L))
val value = getInvocable(Long::class.java).invokeForRequest(request, null)
Assertions.assertThat(value).isEqualTo(1L)
}
@Test
fun valueClassDefaultValue() {
composite.addResolver(StubArgumentResolver(Double::class.java))
val value = getInvocable(Double::class.java).invokeForRequest(request, null)
Assertions.assertThat(value).isEqualTo(3.1)
}
private fun getInvocable(vararg argTypes: Class<*>): InvocableHandlerMethod {
val method = ResolvableMethod.on(Handler::class.java).argTypes(*argTypes).resolveMethod()
val handlerMethod = InvocableHandlerMethod(Handler(), method)
@@ -116,6 +130,18 @@ class InvocableHandlerMethodKotlinTests {
fun nullable(arg: String?): String? {
return null
}
fun valueClass(limit: LongValueClass) =
limit.value
fun valueClass(limit: DoubleValueClass = DoubleValueClass(3.1)) =
limit.value
}
@JvmInline
value class LongValueClass(val value: Long)
@JvmInline
value class DoubleValueClass(val value: Double)
}