当前位置: 首页 > 知识库问答 >
问题:

JPA无法使用START_OBJECT标记作为搜索键

宋华灿
2023-03-14

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

“JSON分析错误:无法反序列化START_OBJECT令牌外的java.lang.Integer实例;嵌套异常为com.fasterxml.jackson.DataBind.JSONMappingException:无法反序列化START_OBJECT令牌外的java.lang.Integer实例\n位于[source:java.io.PushBackInputStream@647F9992;行:1,列:1]”

我有两个名为Payment和Order的实体,其中Payment将Order作为@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并使用它将支付条目从未支付状态更新为已支付状态。这就是我得到上述错误的地方。

服务段:

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

Add从postman那里工作得很好,只有update有问题。任何建议都是好的。谢谢你!

共有1个答案

屠嘉勋
2023-03-14

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

现在,很难从发布的数据中看出更多信息,但很明显,您在引擎希望看到整数的地方提供了一个对象(用方括号括起来的东西)。这是一个内在的关系映射。

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

 类似资料:
  • 我的Json看起来类似于(并且它是不可修改的) 我知道这个问题已经被问了很多次了,甚至我也得到了一些帮助,例如:无法反序列化START_OBJECT令牌之外的java.util.ArrayList实例 但我还是无法克服这个错误

  • 我正在编写一个。NET应用程序,它应该读取一个大约200页长的。docx文件(通常是documentformat.openxml2.5),以查找文档应该包含的某些标记的所有出现情况。明确地说,我不是在寻找OpenXML标记,而是应该由文档编写器设置到文档中的标记,作为在第二阶段需要填充的值的占位符。此类标记应采用以下格式: (其中TAG可以是任意字符序列)。正如我所说的,我必须找到这类标签的所有出

  • 当然,所有依赖项(子类追加在同一个字符串中)。 从外部API获取数据的代码是; 当我运行代码并试图获取adress“API/3”时,出现以下错误:

  • 问题内容: 我正在使用a 从sql数据库搜索查询。这是我的代码。 = JComboBox 但是,当我在组合框中键入一个字母时,它将添加数据库中的所有项目。我知道总是给出一个空字符串。而且,只要我键入一个字母,组合框的文本字段就会为空(我不能键入两个字母的单词)。如何解决这个问题?谢谢。 问题答案: 问题的原因如下: 始终为空是因为您在打电话之前先打电话。这意味着,在获得所选内容之前,将清除(与所选

  • 下面是put请求的控制器映射: 当我运行以下来自邮递员的请求时: 我得到以下异常 我可能很简单,但我不明白我错过了什么?

  • 无效的JSON输入:无法反序列化实例脱离START_OBJECT令牌;嵌套异常为com.fasterxml.jackson.databind.exc.MismatchedInputException:无法反序列化START_OBJECT标记外的``java.util.date`实例 我试图设置默认的日期选择器显示太平洋时间在反应使用功能组件。useState()