نحوه ارسال JSON برای entity های با قید کلید خارجی

یه مشکلی که چند وقت دستم رو بند کرده بود این بود که وقتی توی کلاینت میخواستم یه json برای سرور بفرستم که چندتا از کلیدهاش، کلید خارجی یه جدول دیگه بودن با ارور زیر رو به رو میشدم:

[quote]no int/Int-argument constructor/factory method to deserialize from Number value (30001011)[/quote]

ساختار کلاس کلاس مدل من به شکل زیر بود:

<pre>package ir.ac.ui.comp.bank.model;

import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.util.Date;

/**
 * Created by yashar on 12/9/16.
 */
@Entity
@Table(name = "transactions")
public class Transaction {

    @Id
    @Column(name = "id", nullable = false)
    private int id;

    @OneToOne
    @JoinColumn(name = "from_account")
    private Account fromAccount;

    @OneToOne
    @JoinColumn(name = "to_account")
    private Account toAccount;

    @Column(name = "amount", nullable = false)
    private int amount;
    

    @Column(name = "manager_id")
    private Integer manager_id;

    public Transaction() {
    }

    public int getId() {
        return id;
    }

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

    public Account getFromAccount() {
        return fromAccount;
    }

    public void setFromAccount(Account fromAccount) {
        this.fromAccount = fromAccount;
    }

    public Account getToAccount() {
        return toAccount;
    }

    public void setToAccount(Account toAccount) {
        this.toAccount = toAccount;
    }

    public int getAmount() {
        return amount;
    }

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

    public Integer getManager_id() {
        return manager_id;
    }

    public void setManager_id(Integer manager_id) {
        this.manager_id = manager_id;
    }
}
</pre>

من سعی داشتم با دستور زیر داده برای سرور بفرستم و خب به طبع داده باید روی مدل بالا مپ بشه:


curl -i -X POST -HContent-Type:application/json -HAccept:application/json http://localhost:8080/Bank/transaction/ -d '{ "id":1004,"fromAccount":"30001011","toAccount":30001012,"amount":1000,"manager_id":23 }'

و با خطای زیر رو به رو میشدم:

[quote]no int/Int-argument constructor/factory method to deserialize from Number value (30001011)[/quote]

مشکل وجود دوتا شی از جنس Account بود که اعدادی که من برای کلیدهای fromAccount و toAccount میفرستادم به ترتیب ۳۰۰۰۱۰۱۱ و ۳۰۰۰۱۰۱۲ بودن که اینها کلیدهای جدول Account بودن. پس برای حل مشکل ساختار JSON ارسالی رو به شکل زیر دراوردم:


curl -i -X POST -HContent-Type:application/json -HAccept:application/json http://localhost:8080/Bank/transaction/ -d '{ "id":1004,"fromAccount":{"id":30001011},"toAccount":{"id":30001012},"amount":1000,"manager_id":23 }'

و اینم خروجی خوشحال کننده‌ش 🙂

HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: X-requested-with, Content-Type
Location: http://localhost:8080/Bank/transaction/1004
Content-Length: 0
Date: Fri, 23 Dec 2016 19:57:56 GMT

پاسخ دهید