Skip to content

Commit 598f4bf

Browse files
authored
test: Kotlin DataClasss serialised with JacksonDatabind require reflective access (#11698)
* test * add trailing curly brace * doc: metion the need to annotate with @ReflectiveAccess * link to section
1 parent 94658de commit 598f4bf

File tree

7 files changed

+83
-1
lines changed

7 files changed

+83
-1
lines changed

inject/src/main/java/io/micronaut/context/condition/NotInNativeImage.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
/**
2121
* Condition to hide parts of an application that only work when running on the JVM.
22-
* Internal implementation is identical to {@code if (!ImageInfo.inImageCode()).
22+
* Internal implementation is identical to {@code if (!ImageInfo.inImageCode())}.
2323
* @author Sergio del Amo
2424
* @since 4.8.0
2525
*/
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
To serialize using https://github.com/FasterXML/jackson[Jackson] Databind include the following dependency:
22

33
dependency:micronaut-jackson-databind[]
4+
5+
=== Kotlin Data Classes Jackson Databind Serialization
6+
7+
WARNING: If you use Kotlin https://kotlinlang.org/docs/data-classes.html[Data Classes] and Jackson Databind. Your data classes will be accessed via reflection for serialization. When you use https://www.graalvm.org/latest/reference-manual/native-image/[native image], you need to annotate those data classes with ann:core.annotation.ReflectiveAccess[]. Learn more about <<graal, Micronaut GraalVM>> integration.
8+
9+
[source, kotlin]
10+
----
11+
include::test-suite-kotlin-graalvm/src/test/kotlin/example/micronaut/jacksondatabind/Greeting.kt[tags=clazz,indent=0]
12+
----

test-suite-kotlin-graalvm/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ tasks.withType<Test>().configureEach {
1111
}
1212

1313
dependencies {
14+
testImplementation(libs.managed.kotlin.reflect)
1415
kspTest(projects.micronautInjectKotlin)
16+
kspTest(projects.micronautGraal)
1517
testImplementation(projects.micronautHttpServerNetty)
1618
testImplementation(projects.micronautHttpClient)
1719
testImplementation(projects.micronautJacksonDatabind)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package example.micronaut.jacksondatabind
2+
3+
import io.micronaut.context.annotation.Property
4+
import io.micronaut.http.annotation.Get
5+
import io.micronaut.http.client.annotation.Client
6+
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
7+
import jakarta.inject.Inject
8+
import org.junit.jupiter.api.Assertions
9+
import org.junit.jupiter.api.Test
10+
import org.reactivestreams.Publisher
11+
import reactor.core.publisher.Flux
12+
13+
@Property(name = "spec.name", value = "JacksonDatabindDataClassSerialization")
14+
@MicronautTest
15+
class DataClassSerializationTest {
16+
17+
@Inject
18+
lateinit var client: GreetingClient
19+
20+
@Test
21+
fun testHelloGet() {
22+
Assertions.assertEquals(
23+
"Hola Mundo",
24+
Flux.from(client.hello()).blockFirst()!!.message
25+
)
26+
}
27+
}
28+
29+
@Property(name = "spec.name", value = "JacksonDatabindDataClassSerialization")
30+
@Client("/")
31+
interface GreetingClient {
32+
33+
@Get("/hola")
34+
fun hello() : Publisher<Greeting>
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package example.micronaut.jacksondatabind
2+
3+
import io.micronaut.context.annotation.Requires
4+
import io.micronaut.core.annotation.Introspected
5+
import io.micronaut.core.annotation.ReflectiveAccess
6+
7+
@Requires(property = "spec.name", value = "JacksonDatabindDataClassSerialization")
8+
//tag::clazz[]
9+
@ReflectiveAccess
10+
@Introspected
11+
data class Greeting(val message: String)
12+
//end::clazz[]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package example.micronaut.jacksondatabind
2+
3+
import io.micronaut.context.annotation.Requires
4+
import io.micronaut.context.annotation.Value
5+
import jakarta.inject.Singleton
6+
import reactor.core.publisher.Mono
7+
8+
@Requires(property = "spec.name", value = "JacksonDatabindDataClassSerialization")
9+
@Singleton
10+
class GreetingService {
11+
fun sayHi(): Greeting = Greeting("Hola Mundo")
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package example.micronaut.jacksondatabind
2+
3+
import io.micronaut.context.annotation.Requires
4+
import io.micronaut.http.annotation.Controller
5+
import io.micronaut.http.annotation.Get
6+
7+
@Requires(property = "spec.name", value = "JacksonDatabindDataClassSerialization")
8+
@Controller
9+
class HolaController(private val greetingService: GreetingService) {
10+
@Get("/hola")
11+
fun sayHi(): Greeting = greetingService.sayHi()
12+
}

0 commit comments

Comments
 (0)