在 Spring 项目中更新现有 Gradle Libs 依赖项以使用 Jackson 2.8.5 和 DynamoDB 编组 ZonedDateTime
Update existing Gradle Libs dependencies to marshal ZonedDateTime with Jackson 2.8.5 and DynamoDB in Spring Project
我的任务是将我们所有现有的存储库从 Joda Time 转换为 Java 8 time,但我在途中遇到了很多障碍。第一个涉及 DynamoDB 本身并不支持 Java 8,因此我在网络的一些帮助下为 ZonedDateTime 制作了一个自定义转换器。结果在这里:
static public class ZonedDateTimeConverter implements DynamoDBTypeConverter<String, ZonedDateTime> {
@Override
public String convert(final ZonedDateTime time) {
return time.toString();
}
@Override
public ZonedDateTime unconvert(final String stringValue) {
return ZonedDateTime.parse(stringValue);
}
}
因此,它负责从 ZonedDateTime 到 String 的封送处理,然后返回 DynamoDB。但我现在的最后一个问题是从 ZonedDateTime 编组到 String 以进行 Spring / Jackson 依赖注入(我相信。对所有这些东西来说还是很新的)。
根据 Whosebug,现在我需要 jackson-datatype-jsr310
,即 here。但是在那个页面上它说我需要能够编组 ZonedDateTime 的是 Jackson 2.8.5
现在 libs.gradle
我可以看到我们正在使用 Jackson 2.5.0 jackson: 'com.fasterxml.jackson.core:jackson-databind:2.5.0',
所以这很有意义只是需要更新它吗?
所以我将 libs.gradle
更新为 jackson: 'com.fasterxml.jackson.core:jackson-databind:2.8.5',
并且我已将 libs.jackson
添加到 build.gradle
文件的编译部分:compile(libs.jackson)
但我在构建时仍然收到 com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.ZonedDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
。
我还尝试将 jackson core 和 jackson databind 添加到 ext.libs
定义中:
jacksonCore: 'com.fasterxml.jackson.core:jackson-core:2.8.5',
jacksonBind: 'com.fasterxml.jackson.core:jackson-databind:2.8.5',
和 build.gradle
:
libs.jacksonCore,
libs.jacksonBind
仍然没有骰子。有什么想法吗?
我想通了!这是我的
build.gradle
:
compile(
libs.jacksonCore,
libs.jacksonBind,
libs.jacksonData
)
和libs.gradle
:
jacksonCore: 'com.fasterxml.jackson.core:jackson-core:2.8.8',
jacksonBind: 'com.fasterxml.jackson.core:jackson-databind:2.8.8',
jacksonData: 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8',
我以为 jackson-datetype-jsr310
是预先内置到 jackson-core
或 jackson-databind
中的,但显然不是。
我的任务是将我们所有现有的存储库从 Joda Time 转换为 Java 8 time,但我在途中遇到了很多障碍。第一个涉及 DynamoDB 本身并不支持 Java 8,因此我在网络的一些帮助下为 ZonedDateTime 制作了一个自定义转换器。结果在这里:
static public class ZonedDateTimeConverter implements DynamoDBTypeConverter<String, ZonedDateTime> {
@Override
public String convert(final ZonedDateTime time) {
return time.toString();
}
@Override
public ZonedDateTime unconvert(final String stringValue) {
return ZonedDateTime.parse(stringValue);
}
}
因此,它负责从 ZonedDateTime 到 String 的封送处理,然后返回 DynamoDB。但我现在的最后一个问题是从 ZonedDateTime 编组到 String 以进行 Spring / Jackson 依赖注入(我相信。对所有这些东西来说还是很新的)。
根据 Whosebug,现在我需要 jackson-datatype-jsr310
,即 here。但是在那个页面上它说我需要能够编组 ZonedDateTime 的是 Jackson 2.8.5
现在 libs.gradle
我可以看到我们正在使用 Jackson 2.5.0 jackson: 'com.fasterxml.jackson.core:jackson-databind:2.5.0',
所以这很有意义只是需要更新它吗?
所以我将 libs.gradle
更新为 jackson: 'com.fasterxml.jackson.core:jackson-databind:2.8.5',
并且我已将 libs.jackson
添加到 build.gradle
文件的编译部分:compile(libs.jackson)
但我在构建时仍然收到 com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.ZonedDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
。
我还尝试将 jackson core 和 jackson databind 添加到 ext.libs
定义中:
jacksonCore: 'com.fasterxml.jackson.core:jackson-core:2.8.5',
jacksonBind: 'com.fasterxml.jackson.core:jackson-databind:2.8.5',
和 build.gradle
:
libs.jacksonCore,
libs.jacksonBind
仍然没有骰子。有什么想法吗?
我想通了!这是我的
build.gradle
:
compile(
libs.jacksonCore,
libs.jacksonBind,
libs.jacksonData
)
和libs.gradle
:
jacksonCore: 'com.fasterxml.jackson.core:jackson-core:2.8.8',
jacksonBind: 'com.fasterxml.jackson.core:jackson-databind:2.8.8',
jacksonData: 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8',
我以为 jackson-datetype-jsr310
是预先内置到 jackson-core
或 jackson-databind
中的,但显然不是。