- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的值类构建自定义反序列化器类。但是 ObjectMapper .readValue 会被多次调用,直到抛出 StackOverflowException 为止。以下仅为示例:
@JsonDeserialize(using = UserDeserializer.class)
@Getter
public class User {
private String name;
}
public class UserDeserializer extends StdDeserializer<User> {
public UserDeserializer() {
super(User.class);
}
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return ctxt.readValue(p, User.class);
}
}
public class UserDeserializerTest {
@Test
public void whenUserIsDeserializedFromJsonThenNameShouldEqualBob() {
String = "{ \"name\" : \"bob\" }";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
assertThat(user.getName).isEqualTo("bob");
}
}
Maven 依赖项:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
抛出以下 StackOverflowException:
Exception in thread "main" java.lang.StackOverflowError
...
// The following lines are repeated.
at com.fasterxml.jackson.databind.DeserializationContext.readValue(DeserializationContext.java:754)
at com.fasterxml.jackson.databind.DeserializationContext.readValue(DeserializationContext.java:746)
at example.UserDeserializer.deserialize(UserDeserializer.java:25)
at example.UserDeserializer.deserialize(UserDeserializer.java:15)
Process finished with exit code 1
我尝试通过模块注册反序列化器并删除@JsonAnnotation,但仍然抛出相同的异常:
SimpleModule module = new SimpleModule("User Simple Module");
module.addDeserializer(User.class, new UserDeserializer());
ObjectMapper mapper = new ObjectMapper();
mapper.addModule(module);
mapper.readValue(json, User.class);
然后我尝试在 UserDeserializer 中创建一个新的 ObjectMapper,并从我的 User 类和测试通过中删除 @JsonDeserialize。
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return new ObjectMapper().readValue(p, User.class);
}
在执行上述工作时,我想使用 @JsonDeserialize 注释在每个类的基础上注册反序列化器,而不是注册全局自定义对象映射器。我有这样的愿望。
我尝试了其他代码组合,例如:
// Add the 'as' keyword to the annotation
@JsonDeserialise(using = UserDeserialize.class, as = User.class)
// Locally assigning a mapper from the JsonParser inside the UserDeserializer class
ObjectMapper mapper = (ObjectMapper) p.getCodec();
mapper.readValue(p, User.class);
// Constructing a new JSON Parser inside the deserializer
ObjectMapper mapper = (ObjectMapper) p.getCodec();
JsonFactory factory = mapper.getFactory();
JsonParser parser = factory.createParser(p.getText());
return (User) parser.readValueAs(handledType());
// Reading the Json into a Tree
ObjectMapper mapper = (ObjectMapper) p.getCodec();
ObjectNode root = (ObjectNode) p.readValueAsTree();
return mapper.readValue(root.traverse(), User.class);
但是将 JSON 读入树中会抛出:
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalStateException: No ObjectCodec defined for parser, needed for deserialization
at example.User.main(User.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.IllegalStateException: No ObjectCodec defined for parser, needed for deserialization
at com.fasterxml.jackson.core.JsonParser._codec(JsonParser.java:1565)
at com.fasterxml.jackson.core.JsonParser.readValueAsTree(JsonParser.java:1559)
at example.UserDeserializer.deserialize(UserDeserializer.java:37)
at example.UserDeserializer.deserialize(UserDeserializer.java:17)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3674)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1996)
at example.UserDeserializer.deserialize(UserDeserializer.java:38)
at example.UserDeserializer.deserialize(UserDeserializer.java:17)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3702)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2714)
at example.User.main(User.java:36)
... 5 more
我还尝试在 UserDeserializer 中实现 ContextualDeserializer,但仍然得到与以前相同的 StackOverflowException:
private UserDeserializer(Class<?> vc) {
super(vc);
}
public JsonDeserializer<User> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
return new UserDeserializer(ctxt.getContextualType().getRawClass());
}
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return (User) new ObjectMapper().readValue(p, handledType());
}
我希望这只是 PEBKAC 错误的一个糟糕情况,并且在您的帮助/指导下可以轻松找到解决方案。
亲切的问候
最佳答案
我同意 KDM,尝试这个反序列化器:
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = p.readValueAsTree();
User user = new User();
user.setName(node.get("name").asText());
return user;
}
}
关于java - ObjectMapper readValue 多次调用,直到抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372752/
dataElementsList : TypesAndData.DataElement list 是一个包含 50,000 条记录的列表(实际上更多,但让我们从小处开始)。我正在尝试序列化为 JSON
我试图序列化一个自定义类型,该类型在其他成员中包含一个字典。与字典的键和值相关联的类型是实现的接口(interface)。 字典看起来像 Dictionary TypeA implements IT
我有一个 C# 工厂对象,它使用对象列表作为源,通过工厂方法创建对象。 对象列表的创建方式如下: public WidgetFactory() { widgetLibrary
我正在 GenericList 类中实现递归快速排序方法。我将有第二种方法,它接受一个compareDelegate来比较不同的类型,但出于开发目的,我对GenericList进行排序。 我根据列表大
我为我的作业编写了一种方法,用于通过递归计算整数数组的所有排列。 (我正在尝试实现回溯算法)。但计算超过 7 个数字的前突变时会导致 StackOverflowException 。我不知道如何解决这
我正在尝试将一个大文件拆分成许多小文件。每个拆分发生的位置基于检查每个给定行的内容返回的谓词(isNextObject 函数)。 我试图通过 File.ReadLines 函数读取大文件,这样我就可以
我正在使用 onSuccessCallBack() 接口(interface)方法同步大量数据。按照如图所示的方法将数据发送到服务器。在这里我面临 StackOverflowException 的问题
我必须递归调用一个函数。但片刻之后它会抛出 StackOverFlowException。当我使用 Invoke(new Action(Start)) 方法时,它会抛出相同的异常,但不会在很长一段时间
我有一些依赖于 HttpContext.Cache 的代码,我希望它在满足特定条件时重新缓存某些内容。但是,这会引入潜在的堆栈溢出,我不确定这里的适当方法是什么。 看看这段代码: void OnCac
我将我的代码剥离到导致问题的部分。代码在这里来回跳转第5行和第9行,导致stackoverflowexception。 我该如何做呢?我需要 Game 类中的 Platform 实例才能在函数中使用。
我的问题很简单。我有这个新表格,我只是编写代码: public partial class Form1 : Form { public Form1() { In
根据我的question (通用方法的可重用非通用方法)我已经实现了提供的解决方案,但经过一些重构(将代码移动到基类)后,我的代码导致了我不理解的 StackOverflowException。 调用
背景。我的脚本在递归搜索大字符串中的特定文本时遇到 StackOverflowException。循环不是无限的;问题发生在 9,000-10,000 次合法搜索之间(对于特定搜索)——我需要它继续进
请帮助我解决 System.StackOverflowException我想用 .aspx 将记录写入数据库我使用 4 层架构来实现这一切都正常但是当我编译页面然后它显示要插入数据的字段时,当我将数据
我正在尝试回答 my own old question基于我唯一的(无效的)答案。 这个想法是为了简化按值排序的映射的创建: public class SortedByValueMap> implem
我目前正在制作有界数组堆栈。此方法将大于存储容量的数组抛出到 StackOverflowException,除了我不断收到“throws StackOverflowException 部分”的错误消息
我正在使用以下方法递归迭代对象的属性: void GetProps(object obj) { if (obj == null) return; var objType
我想做一个非常简单的任务,它以某种方式使程序崩溃。 我有一个包含数字的列表,所有数字都是唯一的。超过一定数量,我想倒序。 示例:5, 16, 11, 3, 8, 4 -> 5, 16, 11, 4,
我正在尝试编写一个函数来检查字符串是否为回文,并使用 this example ,我正在尝试使用递归匿名函数反转字符串: static Boolean checkPalindromeAnonRec(s
这段代码有什么问题?我不断收到 StackOverlflowException.. public class Places { public string Title { get; set;
我是一名优秀的程序员,十分优秀!