序列化javax.measure.Quantity属性
如果我尝试将一个对象序列化为JSON,并将其发送到带有Quantity属性的RESTful web服务!=null,我得到以下错误序列化javax.measure.Quantity属性,java,json,builder,units-of-measurement,Java,Json,Builder,Units Of Measurement,如果我尝试将一个对象序列化为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]->
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;
导入javax.measure.quantity.Mass;
公营大院{
私人数量;
公共数量{
返回量;
}
公共空间集合数量(数量集合数量){
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);
化合物=新化合物();
双值=1;
单位=单位。千克;
数量=数量。获取数量(值,单位);
复合物.设置量(数量);
这是抛出错误的地方(适用于没有数量的所有其他20个实体):
Builder=ClientBuilder.newClient()
.target(webServiceUrl)
.path(路径)
.request(MediaType.APPLICATION_JSON);
实体e=Entity.json(实体);//作品
响应=builder.put(e);//重新装载时出错!=无效的
使用的技术:Jackson、RestEasy、javax.measure.unit-api(1.0版)、tec.units.unit-ri(1.0.3版)
问题:
提前多谢 JSR363与Jackson配合得很好,如本模块所示,该模块源自Opower(现为Oracle)的贡献
它不使用RI,虽然堆栈跟踪不是非常透明,但可能的原因是,RI与Java SE端口不同,它不使用
Serializable
。因为RI与Java ME 8 Embedded兼容,并且不包括可序列化。如果解决了问题,请尝试uom se并告知我们 JSR363与Jackson配合得很好,如本模块所示,该模块源自Opower(现为Oracle)的贡献
它不使用RI,虽然堆栈跟踪不是非常透明,但可能的原因是,RI与Java SE端口不同,它不使用
Serializable
。因为RI与Java ME 8 Embedded兼容,并且不包括可序列化。如果解决了问题,请尝试uom se并告知我们 我尝试了其他一些接口实现,但没有成功
我找到了一个足够好的解决方案来实现RESTful web服务。因此,我使用了一个定制的序列化程序,它给了我数量的值和单位,这实际上是我在客户端重建数量所需要的一切
public class QuantitySerializer<Q extends Quantity<Q>> extends JsonSerializer<Quantity<Q>> {
@Override
public void serialize(Quantity<Q> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
try {
gen.writeNumberField("value", value.getValue().intValue());
gen.writeStringField("unit", value.getUnit().toString());
} catch (NullPointerException e) {}
gen.writeEndObject();
}
}
公共类QuantitySerializer扩展JsonSerializer{
@凌驾
public void serialize(数量值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
gen.writeStartObject();
试一试{
gen.writeNumberField(“value”,value.getValue().intValue());
gen.writeStringField(“unit”,value.getUnit().toString());
}捕获(NullPointerException e){}
writeEndObject将军();
}
}
我尝试了其他一些接口实现,但没有成功
我找到了一个足够好的解决方案来实现RESTful web服务。因此,我使用了一个定制的序列化程序,它给了我数量的值和单位,这实际上是我在客户端重建数量所需要的一切
public class QuantitySerializer<Q extends Quantity<Q>> extends JsonSerializer<Quantity<Q>> {
@Override
public void serialize(Quantity<Q> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
try {
gen.writeNumberField("value", value.getValue().intValue());
gen.writeStringField("unit", value.getUnit().toString());
} catch (NullPointerException e) {}
gen.writeEndObject();
}
}
公共类QuantitySerializer扩展JsonSerializer{
@凌驾
public void serialize(数量值、JsonGenerator gen、SerializerProvider序列化程序)引发IOException{
gen.writeStartObject();
试一试{
gen.writeNumberField(“value”,value.getValue().intValue());
gen.writeStringField(“unit”,value.getUnit().toString());
}捕获(NullPointerException e){}
writeEndObject将军();
}
}
Well-uom.se不适用于GeoTools-{code}java.lang.NoSuchMethodError:tec.uom.se.format.SimpleUnitFormat.getInstance()Ltec/uom/se/format/SimpleUnitFormat{code}您使用的确切依赖关系是什么?这个线程主要是关于用Jackson序列化JSR363或385,那么您是否尝试使用JSON来实现这一点?嗯-uom.se不适用于GeoTools-{code}java.lang.NoSuchMethodError:tec.uom.se.format.SimpleUnitFormat.getInstance()Ltec/uom/se/format/SimpleUnitFormat{code}您使用的确切依赖关系是什么?这个线程主要是关于用Jackson序列化JSR363或385,那么您是否尝试使用JSON?您到底是如何使用这个自定义序列化程序的?您到底是如何使用这个自定义序列化程序的?
public class QuantitySerializer<Q extends Quantity<Q>> extends JsonSerializer<Quantity<Q>> {
@Override
public void serialize(Quantity<Q> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
try {
gen.writeNumberField("value", value.getValue().intValue());
gen.writeStringField("unit", value.getUnit().toString());
} catch (NullPointerException e) {}
gen.writeEndObject();
}
}