fred
fred

Reputation: 1822

Kotlin data class Jackson @JsonProperty not honored

I'm wiring up Feign to POST using a Kotlin data class.

The API I'm calling expects {..."brandInfo":{"TPID":1}...}

My understanding is, if the jackson-module-kotlin dependency wasn't being picked up correctly, Feign wouldn't be able to POST at all, because Jackson encoding would fail outright.

However, Feign is able to POST, and Jackson is able to encode, but no matter what I do, what's being posted is {..."brandInfo":{"tpid":1}...}, despite the brandInfo val being annotated with @JsonProperty("TPID").

What am I missing?

@JsonIgnoreProperties(ignoreUnknown = true)
data class KBrandInfo (
    @JsonProperty("TPID") //not honored
    val TPID: Long
)


interface KConversationServiceClient {
    @RequestLine("POST v2/conversations")
    @Headers("Content-Type: application/json")
    fun createConversation(createConversation: KCreateConversation): String
}


@Provides
public KConversationServiceClient getKConversationServiceClient(
        @Named("conversationServiceUrl") String baseUri,
        Feign.Builder builder) {
    return builder
            .logLevel(Logger.Level.FULL)
            .decoder(new StringDecoder())
            .encoder(new JacksonEncoder(jacksonObjectMapper())) //does this need some extra configuration in order to pick up @JsonProperty annotations?
            .requestInterceptor(requestTemplate ->
                    requestTemplate
                            .header("requestId", UUID.randomUUID().toString())
            .target(KConversationServiceClient.class, baseUri);
}


<properties>
    ...
    <feign.version>9.3.1</feign.version>
    <kotlin.version>1.1.51</kotlin.version>
    ...
</properties>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-core</artifactId>
        <version>${feign.version}</version>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-hystrix</artifactId>
        <version>${feign.version}</version>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-slf4j</artifactId>
        <version>${feign.version}</version>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-jackson</artifactId>
        <version>${feign.version}</version>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-gson</artifactId>
        <version>${feign.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jre8</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-test-junit</artifactId>
        <version>${kotlin.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <version>2.7.9</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${fasterxml.jackson.version}</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <!--Kotlin + Java + Maven implies some funky temporal dependencies and handling of annotation processing when building-->
        <!--* https://kotlinlang.org/docs/reference/using-maven.html-->
        <!--* https://kotlinlang.org/docs/reference/kapt.html-->
        <!--* https://github.com/JetBrains/kotlin-examples/blob/master/maven/dagger-maven-example/pom.xml-->
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <source>src/main/kotlin</source>
                            <source>src/main/java</source>
                            <source>target/generated-sources/annotations</source>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
        ...

Upvotes: 4

Views: 4899

Answers (1)

Milosz Tylenda
Milosz Tylenda

Reputation: 362

What helped to me was to specify that the annotation should be applied to the getter: @get:JsonProperty("TPID")

Upvotes: 4

Related Questions