泽西岛错误地解析json long

时间:2015-07-03 12:29:47

标签: java hibernate jersey moxy

我正在使用jersey来创建一个json / xml REST api。但我在Moxy遇到了一些奇怪的行为。

当它大于某个值时,它似乎会切断一个java并将值向上舍入。

我用于相关实体的主键是:871687120000007010,但如果我查询我的api进行测试,则会发生以下情况:

http://i.stack.imgur.com/QbExD.png

请注意,图像显示“EAN”(主键)已被切断。 在用它进行一些测试后,我发现了以下内容:

使用9223372036854775807作为主键(64位有符号整数的最大值)
收益率:9223372036854776000经过moxy解析后。这高于64bit signed int即可。

但是输入9223372036854774807
收益率9223372036854775000

似乎以1000精度向上舍入高值。

有没有人知道这里发生了什么?

模特课:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "CONNECTION")
@XmlRootElement
public class P4Connection {

    @XmlElement
    @Column(name = "SENDER", nullable = false)
    private long sender;

    @XmlElement
    @Column(name = "RECEIVER", nullable = false)
    private long receiver;

    @Id
    @XmlElement(type = Long.class)
    @Column(name = "ID", nullable = false)
    private long ean;

    @XmlElement
    @Column(name = "LAST_COLLECT")
    private Date lastCollect;

    @ManyToMany
    private Set<Request> REQUEST;

    public P4Connection() {
        REQUEST = new HashSet<>();
    }

    @XmlTransient
    public long getSender() {
        return sender;
    }

    public void setSender(long sender) {
        this.sender = sender;
    }

    @XmlTransient
    public long getReceiver() {
        return receiver;
    }

    public void setReceiver(long receiver) {
        this.receiver = receiver;
    }

    @XmlTransient
    public long getEan() {
        return ean;
    }

    public void setEan(long id) {
        this.ean = id;
    }

    @XmlTransient
    public Date getLastCollect() {
        return lastCollect;
    }

    public void setLastCollect(Date lastCollect) {
        this.lastCollect = lastCollect;
    }

    public Set<Request> getRequests() {
        return REQUEST;
    }
}

API方法:

@GET
@Path("/{ean}")
@Produces(MediaType.APPLICATION_JSON)
public P4Connection getConnection(@PathParam("ean") String ean,
                                  @Context UriInfo uriInfo) throws AppException {
    long eancode = parseEAN(ean, uriInfo);
    Session session = Database.getInstance().getSession();
    Query query = session.createQuery("from P4Connection where ean = ?");
    query.setLong(0, eancode);
    List connections = query.list();
    session.close();

    if (connections.size() != 1)
        throw new AppException(ErrorCode.NOT_FOUND, uriInfo);
    System.out.println(((P4Connection) connections.get(0)).getEan());
    return (P4Connection) connections.get(0);
}

当我通过更改@Produces注释

将其呈现为XML时,不会发生这种情况

1 个答案:

答案 0 :(得分:0)

原来我在浏览器中使用的插件错误地显示了长值