【发布时间】:2018-04-15 21:45:07
【问题描述】:
如果我尝试将对象序列化为 JSON 并将其发送到具有 Quantity 属性的 RESTful Web 服务!= null,我会收到以下错误
Caused by: java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]->tec.units.ri.Identity["conversionSteps"]->java.util.ArrayList[0]->tec.units.ri.Identity["conversionSteps"]-> ... (and so on))
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.loadHttpMethod(ApacheHttpClient4Engine.java:430)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:281)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]->tec.units.ri.Identity["conversionSteps"]->java.util.ArrayList[0]->tec.units.ri.Identity["conversionSteps"]->java.util.ArrayList[0]->tec.units.ri.Identity["conversionSteps"]-> ... (and so on))
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:694)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:672)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:678)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)
...
(and so on)
这是简化的实体...
import javax.measure.Quantity;
import javax.measure.quantity.Mass;
public class Compound {
private Quantity<Mass> regAmount;
public Quantity<Mass> getRegAmount() {
return regAmount;
}
public void setRegAmount(Quantity<Mass> regAmount) {
this.regAmount = regAmount;
}
}
这是我如何设置值的示例:
Compound compound = new Compound();
double value = 1;
Unit<Mass> unit = Units.KILOGRAM;
Quantity<Mass> quantity = Quantities.getQuantity(value, unit);
compound.setRegAmount(quantity);
这是引发错误的地方(适用于所有其他 20 个没有数量的实体):
Builder builder = ClientBuilder.newClient()
.target(webServiceUrl)
.path(path)
.request(MediaType.APPLICATION_JSON);
Entity<E> e = Entity.json(entity); // works
response = builder.put(e); // error if regAmount != null
使用的技术:Jackson、RestEasy、javax.measure.unit-api(1.0 版)、tec.units.unit-ri(1.0.3 版)
问题:
- 您知道是什么问题以及如何解决此问题吗?
- 是否有其他方法来设置 regAmount?
- 您能推荐不同的方法或技术吗?
提前非常感谢!
【问题讨论】:
标签: java json builder units-of-measurement