2017-08-25 4 views
2

Après avoir envoyé un POST je reçois une erreur 400 curl localhost:8888/bills/addbill -H "Content-Type: application/json" -X POST -d '{"number":"111A111", "customer":"Customer Cuustomer Rrrr", "phone":"1 800 5551212", "manager":"Manager Manager Manager", "date":"2012-09-17", "curId":{"id":"1"}, "payments":{["id":"1"]}}'Jakson ne peut pas désérialiser instance de java.util.ArrayList sur START_OBJECT jeton

La réponse est: {"timestamp":1503684882518,"status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Bad Request","path":"/bills/addbill"}

Je reçois une exception lorsque J'essaye de désérialiser les données de mon json. Comment désérialiser JSON correctement?

Bill fichier enntity est:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import ru.test.practice.view.PaymentView; 
import javax.persistence.*; 
import javax.validation.constraints.*; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
@Entity 
@Table(name = "Bill") 
public class Bill { 

    @GeneratedValue 
    @Id 
    @Column(name = "id") 
    private Integer id; 

    @Version 
    private int version; 

    @Column(name = "number") 
    @NotNull(message = "Num should be set") 
    @Size(min = 6, max = 10) 
    @Pattern(regexp = "^[^\\W_]+$") 
    private String number; 

    @Column(name = "customer") 
    @NotNull 
    @Size(max = 256) 
    @Pattern(regexp = "^[a-zA-Z\\s]*$") 
    private String customer; 

    @Column(name = "phone") 
    @NotNull 
    @Size(max = 20) 
    @Pattern(regexp = "(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]\u200C\u200B)\\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)([2-9]1[02-9]\u200C\u200B|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})\\s*(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+)\\s*)?$") 
    private String phone; 

    @Column(name = "manager") 
    @Pattern(regexp = "^[a-zA-Z\\s]*$") 
    @Size(max = 256) 
    @NotNull 
    private String manager; 

    @Column(name = "date") 
    @NotNull 
    private Date date; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "cur_id") 
    private Currency curId; 

    @ManyToMany(targetEntity = ru.test.practice.model.Payment.class) 
    public List<PaymentView> payments = new ArrayList<>(); 

    public List<PaymentView> getPayments() { 
     return payments; 
    } 

    public void setPayments(List<PaymentView> payments) { 
     this.payments = payments; 
    } 

    public Bill(Integer id, String number, String customer, String phone, String manager, Date date, Currency curId, List<PaymentView> payments) { 
     this.id = id; 
     this.number = number; 
     this.customer = customer; 
     this.phone = phone; 
     this.manager = manager; 
     this.date = date; 
     this.curId = curId; 
     this.payments = payments; 
    } 

    public Bill() { 
     this.id = null; 
     this.number = null; 
     this.customer = null; 
     this.phone = null; 
     this.manager = null; 
     this.date = null; 
     this.curId = null; 
     this.payments = null; 
    } 


    public String getNumber() { 
     return number; 
    } 

    public void setNumber(String number) { 
     this.number = number; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public int getVersion() { 
     return version; 
    } 

    public void setVersion(int version) { 
     this.version = version; 
    } 

    public String getCustomer() { 
     return customer; 
    } 

    public void setCustomer(String customer) { 
     this.customer = customer; 
    } 

    public String getManager() { 
     return manager; 
    } 

    public void setManager(String manager) { 
     this.manager = manager; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public Currency getCurId() { 
     return curId; 
    } 

    public void setCurId(Currency curId) { 
     this.curId = curId; 
    } 
} 

fichier BillView est

package ru.test.practice.view; 
import io.swagger.annotations.ApiModelProperty; 
import ru.bellintegrator.practice.model.Currency; 
import java.util.Date; 
import java.util.List; 

public class BillView { 

    @ApiModelProperty(hidden = true) 
    public Integer id; 

    public String customer; 

    public String phone; 

    public String manager; 

    public String number; 

    public Date date; 

    public Currency curId; 

    public List<PaymentView> payments; 

    //для jackson 
    public BillView() { 
    } 

    public BillView(Integer id, String number, String customer, String phone, String manager, Date date, Currency curId, List<PaymentView> payments) { 
     this.id = id; 
     this.number = number; 
     this.customer = customer; 
     this.phone = phone; 
     this.manager = manager; 
     this.date = date; 
     this.curId = curId; 
     this.payments = payments; 
    } 

    @Override 
    public String toString() { 
     return "{id:" + id + 
       "billNumber:" + number + 
       ";customer:" + customer + 
       ";phone:" + phone + 
       ";manager:" + manager + 
       ";date:" + date + 
       ";currencyId:" + curId + 
       ";payments:" + payments + 
       "}"; 
    } 
} 

Controller en classe BillController qui gère une requête POST

@Override 
    @ApiOperation(value = "addBill", nickname = "addBill", httpMethod = "POST") 
    @ApiResponses(value = { 
      @ApiResponse(code = 200, message = "Success", response = String.class), 
      @ApiResponse(code = 404, message = "Not Found"), 
      @ApiResponse(code = 500, message = "Failure")}) 
    @RequestMapping(value = "/addbill", method = {POST}) 
    public void bill(@RequestBody BillView bill) { 
     billService.add(bill); 
    } 

    @Override 
    @ApiOperation(value = "getBills", nickname = "getBills", httpMethod = "GET") 
    @RequestMapping(value = "/list", method = {GET}) 
    public List<BillView> bills() { 
     return billService.bills(); 
    } 

Enfin ma classe paiements Entité:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

import javax.persistence.*; 
import java.util.ArrayList; 
import java.util.List; 

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
@Entity 
@Table(name = "Payments") 
public class Payment { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Integer id; 

    @Version 
    private Integer version; 

    @Column(name = "name", nullable = false, length = 256) 
    private String name; 

    @Column(name = "price", nullable = false) 
    private float price; 

    @ManyToMany(targetEntity = ru.bellintegrator.practice.model.Bill.class, mappedBy = "curId") 
    private List<Bill> bills = new ArrayList<>(); 

    public List<Bill> getBills() { 
     return bills; 
    } 

    public void setBills(List<Bill> bills) { 
     this.bills = bills; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public int getVersion() { 
     return version; 
    } 

    public void setVersion(int version) { 
     this.version = version; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public float getPrice() { 
     return price; 
    } 

    public void setPrice(float price) { 
     this.price = price; 
    } 
} 
+0

"paiements": [{ "id": "1"}]} est la bonne façon d'envoyer la liste des objets. – surya

Répondre

0

vous avez des problèmes dans votre JSON

"payments":{["id":"1"]} 

puisque vous essayez de désérialiser liste de type PaymentView cela devrait être, je suppose que PaymentView contient l'attribut id

"payments":[{"id":"1"}] 
+0

Ouais, merci. Maintenant, j'ai des problèmes avec le fichier dao: D – Yiour