【问题标题】:Kotlin data class Jackson @JsonProperty not honoredKotlin 数据类 Jackson @JsonProperty 不兑现
【发布时间】:2018-04-19 07:32:56
【问题描述】:

我正在使用 Kotlin 数据类将 Feign 连接到 POST。

我调用的 API 需要 {..."brandInfo":{"TPID":1}...}

我的理解是,如果没有正确提取 jackson-module-kotlin 依赖项,Feign 将根本无法 POST,因为 Jackson 编码将彻底失败。

但是,Feign 能够发布,Jackson 能够编码,但无论我做什么,发布的内容都是 {..."brandInfo":{"tpid":1}...},尽管使用@JsonProperty("TPID") 注释的brandInfo val。

我错过了什么?

@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>
        ...

【问题讨论】:

  • 我正在按照github.com/FasterXML/jackson-module-kotlin 的指示调用jacksonObjectMapper()。在 .encoder(new JacksonEncoder(jacksonObjectMapper())) 之前,我尝试使用 ObjectMapper mapper = jacksonObjectMapper(); 进行配置JacksonEncoder 编码器 = new JacksonEncoder(mapper); mapper.setPropertyNamingStrategy(new PropertyNamingStrategy()); mapper.registerModule(new KotlinModule());无济于事。
  • MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES 用于传入,所以它不起作用。但是 mapper.configure(USE_STD_BEAN_NAMING, true);看起来它达到了预期的效果,干杯。
  • 是的,我只是想知道是否值得调查该属性是否在传出时破坏了某些东西。我一直在查看 2.7.9 和 master 之间的区别,我看到 master 中不再有一个 caveat in 2.7.9:“目前我们在 Kotlin 中使用与 Kotlin M8 到 M11 兼容的参数名称信息”。这能解释问题吗?你能升级 Jackson 和 jackson-module-kotlin 吗?
  • 关于 USE_STD_BEAN_NAMING 的好消息。
  • 再想一想,我是否明确地必须 mapper.configure(USE_STD_BEAN_NAMING, true);意思是 @JsonProperty("TPID") 实际上仍然被忽略?我应该可以升级了。

标签: jackson kotlin feign


【解决方案1】:

对我有帮助的是指定注释应该应用于 getter:@get:JsonProperty("TPID")

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2019-11-09
    • 2020-06-22
    • 2022-08-19
    • 1970-01-01
    • 2020-05-01
    • 2018-03-21
    • 2021-04-17
    • 2018-05-20
    相关资源
    最近更新 更多