【问题标题】:gradle runtime dependency makes test fail because of jackson dependencies issue由于杰克逊依赖问题,gradle运行时依赖导致测试失败
【发布时间】:2022-01-05 16:21:25
【问题描述】:

在 Wildfly 15 上运行的 JEE 项目中,我正在尝试将日志配置为 json 格式。为最近的一些 Spring Boot 项目复制我所做的数十次,我将 net.logstash.logback:logstash-logback-encoder:6.6 添加为 runtimeOnly 依赖项,因为我计划有一个 logback.xml 配置文件。

在构建我的应用程序并运行测试时,添加此依赖项会使某些测试失败:某些控制器无法再序列化 LocalDateTime。

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: de.gefa.tankkarte.common.port.adapter.restapi.RestServiceErrorResponseEntity["timestamp"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276)
    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1006)
    at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.writeTo(ResteasyJackson2Provider.java:328)
    at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.java:137) 

我不明白为什么应该用于日志记录的依赖项会干扰 REST 响应的构建方式......以及 jackson-datatype-jsr310 IS 类路径的一部分。当我运行依赖项任务时,我得到了这个:

runtimeClasspath - Runtime classpath of source set 'main'.
...
+--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.4 -> 2.12.0
|    +--- com.fasterxml.jackson.core:jackson-annotations:2.12.0
|    |    \--- com.fasterxml.jackson:jackson-bom:2.12.0
|    |         +--- com.fasterxml.jackson.core:jackson-annotations:2.12.0 (c)
|    |         +--- com.fasterxml.jackson.core:jackson-core:2.12.0 (c)
|    |         +--- com.fasterxml.jackson.core:jackson-databind:2.12.0 (c)
|    |         \--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.0 (c)
|    +--- com.fasterxml.jackson.core:jackson-core:2.12.0
|    |    \--- com.fasterxml.jackson:jackson-bom:2.12.0 (*)
|    +--- com.fasterxml.jackson.core:jackson-databind:2.12.0
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.12.0 (*)
|    |    +--- com.fasterxml.jackson.core:jackson-core:2.12.0 (*)
|    |    \--- com.fasterxml.jackson:jackson-bom:2.12.0 (*)
|    \--- com.fasterxml.jackson:jackson-bom:2.12.0 (*)
...
+--- net.logstash.logback:logstash-logback-encoder:6.6
|    \--- com.fasterxml.jackson.core:jackson-databind:2.12.0 (*)

我真的不明白这种冲突的方式和原因......

【问题讨论】:

    标签: java gradle jackson-databind


    【解决方案1】:

    我想我不明白原因,但在尝试了不同的事情之后,只有将版本从 6.6 降级到 6.4 才有帮助。现在依赖项看起来像这样:

    runtimeClasspath - Runtime classpath of source set 'main'.
    ...
    +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.4
    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.10.4 -> 2.11.0
    |    +--- com.fasterxml.jackson.core:jackson-core:2.10.4 -> 2.11.0
    |    \--- com.fasterxml.jackson.core:jackson-databind:2.10.4 -> 2.11.0
    |         +--- com.fasterxml.jackson.core:jackson-annotations:2.11.0
    |         \--- com.fasterxml.jackson.core:jackson-core:2.11.0
    ...
    +--- net.logstash.logback:logstash-logback-encoder:6.4
    |    \--- com.fasterxml.jackson.core:jackson-databind:2.11.0 (*)
         
    

    我不明白为什么在这种情况下 jackson-datatype-jsr310:2.10.4 不会自动升级到 2.11.0,而之前升级到 2.12.0。

    目前还可以,但对于未来来说有点可怕:下次有人尝试升级此应用程序的版本时,可能会出现一些问题..

    如果我排除传递依赖项,我什至可以使用最新的 logback-encoder 版本:

    runtimeOnly ('net.logstash.logback:logstash-logback-encoder:7.0.1') {
        exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind'
    }
    

    因此,如果有人了解正在发生的事情以及如何使其在未来更加可靠,请不要犹豫提出建议!

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2014-02-21
      • 2016-08-07
      相关资源
      最近更新 更多