Как десериализовать из числового значения в int (ошибка - нет конструктора int / Int-аргумента / фабричного метода для десериализации из числового значения)

У меня два класса Flight и Ticket. На один рейс может быть много билетов, поэтому Ticket имеет внешний ключ flight_id.

Вот моя база данных с таблицами flight и ticket.

Как десериализовать из числового значения в int (ошибка - нет конструктора int / Int-аргумента / фабричного метода для десериализации из числового значения)

Вот мой json request (из отладчика Mozilla), который я хочу сохранить в базе данных.

Как десериализовать из числового значения в int (ошибка - нет конструктора int / Int-аргумента / фабричного метода для десериализации из числового значения)

Вы видите параметр 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

Билет на занятие

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

Мой класс Flight:

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

Мой класс ticket.ts в Angular:

export class Ticket {
ticket_id: number;
place: string;
customer_id: number;
flight_id: number;
name: string;
surname: string;
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
22 053
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно создать конструктор в Flight с @JsonCreator:

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

почему String id и что это такое id? У меня такого параметра не было.

Viola 17.12.2018 16:54

Извините, это должно быть целое число

Eugen 17.12.2018 17:00

а почему именно Integer id? У меня нет значения id

Viola 17.12.2018 17:06
Ответ принят как подходящий

Он ожидает int flight_id в вашем классе dto. Измените тип типа flight_id на Integer и добавьте еще одну ссылку на рейс в классе TickerDTO. Попробуйте преобразовать его в объект 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.InvalidDefinitionExceptio‌​n: Cannot handle managed/back reference 'flight': back reference type (java.lang.Integer) not compatible with managed type (model.Flight)

Viola 17.12.2018 19:02

Можете ли вы попробовать изменить эту строку в своем классе сущности Ticket: private Flight flight_id; на этот private Flight flight; и в классе сущности Flight: с @OneToMany(mappedBy = "flight_id") на @OneToMany(mappedBy = "flight")

Aditya Narayan Dixit 17.12.2018 19:21

Я пробовал, но получил: Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableExc‌​eption: JSON parse error: Cannot deserialize instance of java.util.LinkedHashMap` из токена VALUE_NUMBER_INT; вложенное исключение - com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр java.util.LinkedHashMap из токена VALUE_NUMBER_INT в [Источник: (PushbackInputStream); строка: 1, столбец: 45] (через цепочку ссылок: dto.TicketDto ["flight_id"]) `

Viola 17.12.2018 19:36

Обновил мой ответ, попробуйте сейчас. Обновлен метод unpackNested.

Aditya Narayan Dixit 17.12.2018 19:44

Другие вопросы по теме