JPA无法使用START_OBJECT TOKEN作为搜索关键字

时间:2017-10-01 04:58:57

标签: java json spring-boot jackson

当我尝试获取先前插入数据库的更新数据时,我在代码中遇到了一些问题。邮递员的错误代码:

  

“JSON解析错误:无法从START_OBJECT标记中反序列化java.lang.Integer的实例;嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.lang.Integer的实例\ n在[来源:java.io.PushbackInputStream@647f9992;第1行,第1栏]:“

我有两个名为Payment and Order的实体,其中Payment将Orders保存为@OnetoOne实体。 付款类:

@Entity
@Table(name = "tbl_payment")
public class Payment {

    @Id
    @GeneratedValue
    @Column(name = "payment_id")
    Integer id;
    @OneToOne(cascade=CascadeType.ALL)
    private Order order;
    @Column(name = "payment_receivable")
    private double receivable;
    @Column(name = "payment_outstanding")
    private double outstanding;
    @Column(name = "payment_status")
    private String status;

    public Payment(Order order, double receivable, double outstanding, String status) {
        this.order = order;
        this.receivable = receivable;
        this.outstanding = outstanding;
        this.status = status;
    }

    public Payment() {
    }

    @Override
    public String toString() {
        return "Payment{" +
                "id=" + id +
                ", order=" + order +
                ", receivable=" + receivable +
                ", outstanding=" + outstanding +
                ", status='" + status + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public double getReceivable() {
        return receivable;
    }

    public void setReceivable(double receivable) {
        this.receivable = receivable;
    }

    public double getOutstanding() {
        return outstanding;
    }

    public void setOutstanding(double outstanding) {
        this.outstanding = outstanding;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

订单类:

@Entity
@Table(name = "tbl_order")
public class Order {

    @Id
    @GeneratedValue
    @Column(name = "order_id")
    Integer id;
    @Column(name = "order_amount")
    int amount;
    @Column(name = "sale_id")
    String sale_id;

    public Order(int amount, String sale_id) {
        this.amount = amount;
        this.sale_id = sale_id;
    }

    public Order() {
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", amount=" + amount +
                ", sale_id='" + sale_id + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    public String getSale_id() {
        return sale_id;
    }

    public void setSale_id(String sale_id) {
        this.sale_id = sale_id;
    }
}

在我的控制器中,我将传递payment_id并使用它将付款条目从UNPAID更新为PAID状态。这是我得到上述错误的地方。

服务代码段:

@Transactional
    @Modifying
    public Payment clearPaymentStatus(Integer p){
        TypedQuery query = em.createQuery("update Payment p set p.payment_status = ?1 where p.id = ?5", Payment.class);
        query.setParameter(1, "PAID");
        query.setParameter(5, new Integer(p));
        return ((Payment) query.getSingleResult());
    }

更新:控制器代码段

@RequestMapping("/clearpayment")
public @ResponseBody ResponseEntity<Payment> ClearPayment(@RequestBody Integer payment_id){
    return new ResponseEntity<Payment>( paymentService.clearPaymentStatus(payment_id), HttpStatus.ACCEPTED);
}

添加工作正常邮递员,只有更新有问题。任何建议都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

JPA与JSON无关。 JSON只是一种输入格式。你有可能试图通过某种控制器提供一些json对象。 此控制器隐式尝试为您转换对象,但未能这样做。通常,它发生的原因是JSON格式无效,或者至少无法映射到对象层次结构。因此,请仔细检查您的JSON并尝试查看它应如何映射。

现在,很难从您发布的数据中得到更多信息,但很明显您在引擎希望看到整数的位置提供了一个对象(方括号中的内容)。这是内部的一些关系映射。

因此,正如我们的同事已经说过的那样,恰好在序列化期间失败的对象(稍后在流内部)应该传递给JPA引擎进行数据库操作,但这个特殊问题与JPA无关