【问题标题】:How to deserialize from Number value to int (error - no int/Int-argument constructor/factory method to deserialize from Number value)如何从数值反序列化为 int(错误 - 没有从数值反序列化的 int/Int 参数构造函数/工厂方法)
【发布时间】:2018-12-17 15:31:45
【问题描述】:

我有两个课程FlightTicket。一个航班可以有很多票,所以Ticket 有外键flight_id

这是我的数据库,其中包含表 flightticket

这是我的json request(来自 Mozilla 调试器),我想将其保存在数据库中。

你可以看到flight_id参数,但是我无法将它保存到我的数据库中,我遇到了这样的错误:

at [Source: (PushbackInputStream); line: 1, column: 53] (through reference chain: dto.TicketDto["flight_id"]) DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance ofmodel.Flight(although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (199); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance ofmodel.Flight(although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value

课票:

@Entity
@Table(name = "ticket")
public class Ticket {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int ticket_id;

@Column(name = "place")
private int place;

@Column(name = "name")
private String name;

@Column(name = "surname")
private String surname;

@JsonDeserialize(using = CustomParameterDeserializer.class)
@ManyToOne(targetEntity = Flight.class)
@JoinColumn(name = "flight_id")
@JsonBackReference("flight")
private Flight flight_id;

// getters setters
// constructor

Class TicketDto:

public class TicketDto {

private int ticket_id;

private int place;

private String name;

private String surname;

private Flight flight_id;

private Customer customer_id;

// getters setters

我的班级航班:

@Entity
@Table(name = "flight")
public class Flight {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int flight_id;

//

@OneToMany(mappedBy = "flight_id")
@JsonManagedReference("flight")
private List<Ticket> ticket;

// getters setters

我的班级 FlightDto:

public class FlightDto {
private int flight_id;

//

private List<TicketDto> ticket;

// getters setters

这是 TicketServiceImpl 类以及保存我的票的方法:

@Service
public class TicketServiceImpl implements TicketService {

@Autowired
TicketRepository repository;

@Override
public Ticket save(TicketDto ticketDto) {
    Ticket ticket = new Ticket();
    ticket.setName(ticketDto.getName());
    ticket.setSurname(ticketDto.getSurname());
    ticket.setCustomer_id(ticketDto.getCustomer_id());
    ticket.setFlight_id(ticketDto.getFlight_id());
    ticket.setPlace(ticketDto.getPlace());

    return repository.save(ticket);
}

我在 Angular 中的 class ticket.ts:

export class Ticket {
ticket_id: number;
place: string;
customer_id: number;
flight_id: number;
name: string;
surname: string;
}

【问题讨论】:

    标签: java json angular foreign-keys


    【解决方案1】:

    它需要一个 int flight_id 在你的 dto 类中。将 flight_id 类型更改为 Integer 并在 TickerDTO 类中添加另一个 Flight 引用。尝试下面将其转换为 Flight 对象:

    public class TicketDto {
    private int ticket_id;
    
    private int place;
    
    private String name;
    
    private String surname;
    
    private Flight flight;
    
    private Customer customer_id;
    
    @JsonProperty("flight_id")
    private void unpackNested(Integer flight_id) {
        this.flight = new Flight();
        flight.setFlight_id(flight_id);
    }
    

    或者,如果您不想更改您的 ticketDto 类,请将您的 json 更改为:

    {
    "name": "name",
    "surname": "surname",
    "flight_id": {
      "flight_id" : 123
    }
    }
    

    【讨论】:

    • 我更改了 TicketDto 类,但出现了新错误:Failed to evaluate Jackson deserialization for type [[simple type, class dto.TicketDto]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'flight': back reference type (java.lang.Integer) not compatible with managed type (model.Flight)
    • 您能否尝试将 Ticket 实体类中的这一行:private Flight flight_id; 更改为 private Flight flight; 和 Flight 实体类:@OneToMany(mappedBy = "flight_id") 更改为 @OneToMany(mappedBy = "flight")
    • 我已经尝试过了,但是得到了:Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of java.util.LinkedHashMap` out of VALUE_NUMBER_INT token;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法在 [Source: (PushbackInputStream); line: 1, column: 45] (通过引用链: dto.TicketDto["flight_id"])`
    • 更新了我的答案,现在试试。更新unpackNested方法
    【解决方案2】:

    对于这个错误,你有两种可能添加到你的类中:

    @JsonProperty("flight_id") private void unpackNested(Integer flight_id) {
        this.flight = new Flight(); flight.setFlight_id(flight_id);
    }
    

    但这不是最好的方法,因为您不会在不了解其背后的影响或进行所有必要分析的情况下修改这样的类

    或者您提供给 DTO 的数据的第二个解决方案将其添加给您:

    "flight_id":{
        "flight_id": id
    }
    

    【讨论】:

      【解决方案3】:

      您需要在 Flight 中使用 @JsonCreator 创建构造函数:

      @JsonCreator
      public Flight (@JsonProperty("flight_id") Integer flight_id ) {
          this.flight_id = flight_id;
      }
      

      【讨论】:

      • 为什么是String idid 是什么?我没有这样的参数。
      • 抱歉必须是整数
      • 但为什么是Integer id?我没有id
      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2017-03-03
      • 2022-12-12
      • 2018-09-09
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      相关资源
      最近更新 更多