小编JDr*_*818的帖子

如何使用 Jackson 反序列化泛型 List<T>?

多年来,我一直在使用 Jackson 来序列化/反序列化对象,并且总是发现使用TypeReference<T>反序列化List等不必要地复杂。我创建了一个简单的辅助函数:

public static <T> TypeReference<List<T>> list() {
    return new TypeReference<List<T>>(){}
}
Run Code Online (Sandbox Code Playgroud)

预期用途:

List<Foo> foos = objectMapper.readValue(json, list());
Run Code Online (Sandbox Code Playgroud)

它有效!的种类。通过调试器进行检查时,不是 的列表Foo,而是 的列表LinkedHashMap。我知道ObjectMapper反序列化为LinkedHashMap类型Object,我在这里阅读了解释:

Jackson 和泛型类型引用

但是,为什么它能够分配List<LinkedHasMap>给 a List<Foo>?至少不应该是某种ClassCastException吗?

另外,有没有办法用Java的类型系统来做到这一点?

注意:以下方法声明具有相同的问题,这是有道理的,因为不需要T确定附加参数:

public static <T> TypeReference<List<T>> listOf(Class<T> ignored) {
    return new TypeReference<List<T>>(){}
}
Run Code Online (Sandbox Code Playgroud)

java class list type-erasure jackson

5
推荐指数
1
解决办法
3506
查看次数

Spring Boot 自定义 Bean 加载器

我正在将 JDBI 与 Spring Boot 结合使用。我遵循了这个指南,这导致必须创建一个类:JdbiConfig其中,对于应用程序上下文中想要的每个 dao,您必须添加:

@Bean
public SomeDao someDao(Jdbi jdbi) {
    return jdbi.onDemand(SomeDao.class);
}
Run Code Online (Sandbox Code Playgroud)

我想知道 Spring Boot 中是否有某种方法可以创建自定义处理器来创建 bean 并将它们放入应用程序上下文中。关于这如何工作,我有两个想法:

  1. 使用自定义注释对 DAO 进行注释,@JdbiDao并编写一些内容来获取它们。我曾尝试将这些手动注入到应用程序启动中,但问题是它们可能无法及时加载以进行注入,因为在类扫描期间无法识别它们。
  2. 创建一个JdbiDao每个存储库接口都可以扩展的类。然后用标准注释接口@Repository并创建自定义处理器以通过以下方式加载它们Jdbi#onDemand

这是我的两个想法,但我不知道有什么方法可以实现。我坚持手动创建一个 bean?以前解决过这个问题吗?

java jdbi spring-boot jdbi3 spring-autoconfiguration

5
推荐指数
1
解决办法
255
查看次数