使用Jackson的Sping Boot 和使用Gson的外部库

pn9klfpd  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(187)

我正在使用一个带有Jackson的Sping Boot 应用程序(版本2.4.5)。我可以添加一个使用gson的fat jar而不影响应用程序的Jackson反序列化吗?
当我将jar添加到我的应用程序中时,应用程序在任何地方都使用gson来反序列化JSON。
不幸的是,我不能在图书馆改变这一点。
我使用Gradle在依赖项中添加如下的fat jar:

implementation fileTree(dir: 'libs', include: ['*.jar'])

我正在构建Jacksons对象Map器,如下所示:

private static ObjectMapper getMapper() {
  ObjectMapper mapper = new ObjectMapper();
  mapper.registerModule(new Jdk8Module());
  mapper.registerModule(new JavaTimeModule());

  return mapper;
}

并且以下行抛出错误:
第一个
Gson被添加到fat jar中,并具有以下maven依赖项:

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>${gson-version}</version>
</dependency>
<dependency>
  <groupId>io.gsonfire</groupId>
  <artifactId>gson-fire</artifactId>
  <version>${gson-fire-version}</version>
</dependency>

编辑

正如所建议的,这不是由于gson,我试图缩小它,并添加了所有的dependecies一个接一个,没有造成错误本身。
但是我可能已经找到了原因,但是我不知道如何解决这个问题。这是JacksontypeFactory构造它的类型的方式。对于行:

List<Book> books = objectMapper.readValue(getReader("books.json"), new TypeReference<>() {});

如果jar不存在,则构造的类型如下所示:

result = {CollectionType@13667} "[collection type; class java.util.List, contains [simple type, class onek.books.backend.model.book.Book]]"
 _elementType = {SimpleType@13669} "[simple type, class onek.books.backend.model.book.Book]"
 _superClass = null
 _superInterfaces = {JavaType[1]@13670} 
 _bindings = {TypeBindings@13671} "<Lonek/books/backend/model/book/Book;>"
 _canonicalName = null
 _class = {Class@352} "interface java.util.List"
 _hash = -95724352
 _valueHandler = null
 _typeHandler = null
 _asStatic = false

这是我所期望的,因为Book-Class在类型中。但是如果我添加jar,构造的类型看起来像这样:

result = {SimpleType@11757} "[simple type, class java.lang.Object]"
 _superClass = null
 _superInterfaces = null
 _bindings = {TypeBindings@11759} "<>"
 _canonicalName = null
 _class = {Class@595} "class java.lang.Object"
 _hash = 1063877011
 _valueHandler = null
 _typeHandler = null
 _asStatic = false

Jackson将其反序列化为具有此类型的LinkedHashmap,从而导致ClassCastException。
但是我真的不知道如何从这里继续下去。一个外部的jar可以改变JacksonTypeFactory的一些部分吗?

9bfwbjaz

9bfwbjaz1#

当Jackson试图反序列化一个没有提供类型信息的对象时,它使用LinkedHashMap来存储对象属性值。异常可能与此相关。
我的猜测是,可能是脂肪罐包括一个不同版本的Jackson从一个您包括在您的项目,其中由于某种原因,这种行为是不同的。
我不知道这是否只是问题中的一个不准确之处,但为了解决这个问题,请尝试在TypeReference中提供实际类型:

List<Book> books = objectMapper.readValue(getReader("books.json"), new TypeReference<List<Book>>() {});

请考虑读取this related articleSO question

mwg9r5ms

mwg9r5ms2#

最有可能的问题在于“胖JAR”的创建。
在创建fat JAR时,请注意以下事项:

  • 应忽略依赖项提供的META-INF/MANIFEST.MF
  • module-info.classMETA-INF/versions/ x1m2n1x /module-info.class提供的依赖关系应该被忽略(后者被Multi-Release JARs使用)
  • 应合并META-INF/services/下的文件内容(它们声明providers for services
  • 可选:如果其中一个依赖关系是Multi-Release JARs,则可以在胖JAR的MANIFEST.MF中设置Multi-Release: true,以允许JRE使用这些版本特定的类
  • 对于所有其他文件,它可能是特定于应用程序的如何处理冲突

如果您使用插件来生成fat JAR,那么它可能会提供这些转换的设置(或者可能默认执行这些转换)。

相关问题