Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化javax.measure.Quantity属性_Java_Json_Builder_Units Of Measurement - Fatal编程技术网

序列化javax.measure.Quantity属性

序列化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]->

如果我尝试将一个对象序列化为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;
导入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版)

问题:

  • 您知道问题是什么以及如何解决此问题吗
  • 是否有其他方法设置regAmount
  • 你能推荐不同的方法或技术吗

  • 提前多谢

    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();
        }
    }