我正在使用一个带有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的一些部分吗?
2条答案
按热度按时间9bfwbjaz1#
当Jackson试图反序列化一个没有提供类型信息的对象时,它使用
LinkedHashMap
来存储对象属性值。异常可能与此相关。我的猜测是,可能是脂肪罐包括一个不同版本的Jackson从一个您包括在您的项目,其中由于某种原因,这种行为是不同的。
我不知道这是否只是问题中的一个不准确之处,但为了解决这个问题,请尝试在
TypeReference
中提供实际类型:请考虑读取this related article和SO question。
mwg9r5ms2#
最有可能的问题在于“胖JAR”的创建。
在创建fat JAR时,请注意以下事项:
META-INF/MANIFEST.MF
module-info.class
和META-INF/versions/ x1m2n1x /module-info.class
提供的依赖关系应该被忽略(后者被Multi-Release JARs使用)META-INF/services/
下的文件内容(它们声明providers for services)MANIFEST.MF
中设置Multi-Release: true
,以允许JRE使用这些版本特定的类如果您使用插件来生成fat JAR,那么它可能会提供这些转换的设置(或者可能默认执行这些转换)。