Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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
Java Jersey/JAXB编组问题具有长精度_Java_Jaxb_Jersey - Fatal编程技术网

Java Jersey/JAXB编组问题具有长精度

Java Jersey/JAXB编组问题具有长精度,java,jaxb,jersey,Java,Jaxb,Jersey,我们将Jersey/Json(v1.12)用于JAX-rsweb服务,并将long作为一些简单JAXB对象编组的一部分输出。我们今天发现了一些问题,我环顾了一下四周,看看这是否是一个普遍问题,但没有成功调试 我们有一个对象使用long作为唯一标识符(根据java规范,2^63-1),即~9223372036854775807(19位左右) 如果我们尝试输出一个长的(17或更少的数字),我们得到了预期的输出(正确) 如果我们尝试输出一个长的(直到2^63-1为止的18位数字),我们会得到错误的输出

我们将Jersey/Json(v1.12)用于JAX-rsweb服务,并将long作为一些简单JAXB对象编组的一部分输出。我们今天发现了一些问题,我环顾了一下四周,看看这是否是一个普遍问题,但没有成功调试

我们有一个对象使用long作为唯一标识符(根据java规范,2^63-1),即~9223372036854775807(19位左右)

如果我们尝试输出一个长的(17或更少的数字),我们得到了预期的输出(正确)

如果我们尝试输出一个长的(直到2^63-1为止的18位数字),我们会得到错误的输出-它似乎将最后的2/3位有效数字四舍五入,例如:

@GET
@Path("/longTest")
@Produces("application/json")    
public JSONObject testLong() {
    JSONObject myObject = new JSONObject();
    try {
        myObject.put("1L", 1);
        myObject.put("13365766603759910L", 13365766603759910L);
        myObject.put("133614582656610538L", 133614582656610538L);
        myObject.put("9133614582656610538L", 9133614582656610538L);    
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return myObject;
}
返回:

{
   "1L":1,
   "13365766603759910L":13365766603759910,
   "133614582656610538L":133614582656610540,
   "9133614582656610538L":9133614582656610000
}
133614582656610538
注意最后两个数字(538-540(18位)和538-000(19位))的包装

如果我直接将long转换为json,它可以正常工作:

@GET
@Path("/longTest3")
@Produces("application/json")    
public long testLong3() {
    return 133614582656610538L;
}
返回:

{
   "1L":1,
   "13365766603759910L":13365766603759910,
   "133614582656610538L":133614582656610540,
   "9133614582656610538L":9133614582656610000
}
133614582656610538
我在初始化Web服务器时添加了POJO JSON支持

我应该为此使用不同的JSONConfiguration或JAXBContextResolver吗


提前感谢您的帮助

可能是个虫子。您可以通过将中的值作为字符串读取并使用XmlAdapter将其转换为长字符串来解决问题。如果注释了setter而不是成员属性本身,例如setId(Long id),则可以提取基元类型并将其分配给正确类型的成员。但是,如果您将这些id用于XmlID和XmlIDREFS,这些都不起作用。现在是2013年,史蒂夫!