Статус": 400 com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр java.lang.Boolean

Я работаю с загрузочным приложением Spring и запускаю команду cURL через терминал,

$ curl -X PUT -H "Content-Type: application/json" -d "{\"status\" : \"false\"}" http://localhost:8080/api/v1/appointments/1

Я получаю ответ,

{"timestamp":"2019-02-08T16:23:32.235+0000","status":400,"error":"Bad Request","message":"JSON parse error: Cannot deserialize instance of java.lang.Boolean out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.lang.Boolean out of START_OBJECT token\n at [Source: (PushbackInputStream); line: 1, column: 1]","path":"/api/v1/appointments/1"}

API представлен ниже,

@PutMapping("/{id}")
    @JsonDeserialize(as = Boolean.class)
    public ResponseEntity<Appointment> updateAppointmentStatus(@PathVariable Long id, @RequestBody Boolean status) {

        Appointment appointment = service.findById(id).get();
        appointment.setStatus(status);

        service.save(appointment);

        return ResponseEntity.status(HttpStatus.ACCEPTED).body(appointment);
    }

Цель состоит в том, чтобы найти встречу и обновить статус доступности.

Так же представлена ​​модель

@Entity
public class Appointment {


//    id
//    created_at
//    appointment_date
//    name_of_doctor
//    status (Available or Booked)
//    price

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private java.sql.Time craeted_at;


    @Column
    private java.sql.Date appointment_date;

    @Column
    private String name_of_doctor;

    @Column
    @JsonProperty("status")
    private Boolean status;

    @Column
    private double price;


    public Appointment() {

    }


    @JsonCreator
    public Appointment(@JsonProperty("craeted_at") Time craeted_at, @JsonProperty("appointment_date") Date appointment_date,
                       @JsonProperty("name_of_doctor") String name_of_doctor, @JsonProperty("status") boolean status, @JsonProperty("price") double price) {

        this.craeted_at = craeted_at;
        this.appointment_date = appointment_date;
        this.name_of_doctor = name_of_doctor;
        this.status = status;
        this.price = price;
    }

    public Appointment(String name_of_doctor, boolean status, double price) {

        this.name_of_doctor = name_of_doctor;
        this.status = status;
        this.price = price;
    }


    public Appointment(String name_of_doctor, double price) {

        this.name_of_doctor = name_of_doctor;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

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

    public Time getCraeted_at() {
        return craeted_at;
    }

    public void setCraeted_at(Time craeted_at) {
        this.craeted_at = craeted_at;
    }

    public Date getAppointment_date() {
        return appointment_date;
    }

    public void setAppointment_date(Date appointment_date) {
        this.appointment_date = appointment_date;
    }

    public String getName_of_doctor() {
        return name_of_doctor;
    }

    public void setName_of_doctor(String name_of_doctor) {
        this.name_of_doctor = name_of_doctor;
    }

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Appointment)) return false;
        Appointment that = (Appointment) o;
        return isStatus() == that.isStatus() &&
                Double.compare(that.getPrice(), getPrice()) == 0 &&
                Objects.equals(getId(), that.getId()) &&
                Objects.equals(getCraeted_at(), that.getCraeted_at()) &&
                Objects.equals(getAppointment_date(), that.getAppointment_date()) &&
                Objects.equals(getName_of_doctor(), that.getName_of_doctor());
    }

    @Override
    public int hashCode() {

        return Objects.hash(getId(), getCraeted_at(), getAppointment_date(), getName_of_doctor(), isStatus(), getPrice());
    }

    @Override
    public String toString() {
        return "Appointment{" +
                "id = " + id +
                ", craeted_at = " + craeted_at +
                ", appointment_date = " + appointment_date +
                ", name_of_doctor='" + name_of_doctor + '\'' +
                ", status = " + status +
                ", price = " + price +
                '}';
    }
}

Может ли кто-нибудь помочь определить, почему доставляется исключение MismatchedInputException?

Кажется, вы пытаетесь преобразовать строковое значение в логическое значение, пробовали ли вы "{\"status\" : false}"?

nullptr 08.02.2019 17:39

Я только что попробовал, и он по-прежнему выдавал тот же стек ошибок. Даже если попробовать "{\"status\" : False}" не получится

Arefe 08.02.2019 17:41

Вероятно, вам нужно создать простой POJOclass Status { Boolean status; }, и он должен работать.

Michał Ziober 08.02.2019 18:05

@MichałZiober Я пишу POJO, и это, наконец, сработало для меня.

Arefe 08.02.2019 19:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
1 433
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я решил это с помощью @RequestParam и обновил API,

@PutMapping("/{id}/update/")
    public ResponseEntity<Appointment> updateAppointmentStatus(@PathVariable Long id, @RequestParam("status") Boolean status) {

        Appointment appointment = service.findById(id).get();
        appointment.setStatus(status);

        service.save(appointment);

        return ResponseEntity.status(HttpStatus.ACCEPTED).body(appointment);
    }

Я делаю вызов следующим образом, который, кажется, работает.

$ curl -X PUT -H "Content-Type: application/json" http://localhost:8080/api/v1/appointments/1/update?status=false
Ответ принят как подходящий

Я создал класс Status и внедрил его в объект Appointment для работы. Код предоставляется.

@Entity
public class Appointment {


//    id
//    created_at
//    appointment_date
//    name_of_doctor
//    status (Available or Booked)
//    price

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private java.sql.Time craeted_at;

    @Column
    private java.sql.Date appointment_date;

    @Column
    private String name_of_doctor;

//    @Column
//    private Boolean status;

    @Embedded
    private Status status;

    @Column
    private double price;

    public Appointment() {

    }

    @JsonCreator
    public Appointment(@JsonProperty("craeted_at") Time craeted_at, @JsonProperty("appointment_date") Date appointment_date,
                       @JsonProperty("name_of_doctor") String name_of_doctor, @JsonProperty("status") Status status, @JsonProperty("price") double price) {

        this.craeted_at = craeted_at;
        this.appointment_date = appointment_date;
        this.name_of_doctor = name_of_doctor;
        this.status = status;
        this.price = price;
    }

    public Appointment(String name_of_doctor, Status status, double price) {

        this.name_of_doctor = name_of_doctor;
        this.status = status;
        this.price = price;
    }

    public Appointment(String name_of_doctor, double price) {

        this.name_of_doctor = name_of_doctor;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

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

    public Time getCraeted_at() {
        return craeted_at;
    }

    public void setCraeted_at(Time craeted_at) {
        this.craeted_at = craeted_at;
    }

    public Date getAppointment_date() {
        return appointment_date;
    }

    public void setAppointment_date(Date appointment_date) {
        this.appointment_date = appointment_date;
    }

    public String getName_of_doctor() {
        return name_of_doctor;
    }

    public void setName_of_doctor(String name_of_doctor) {
        this.name_of_doctor = name_of_doctor;
    }

    public Status isStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Appointment)) return false;
        Appointment that = (Appointment) o;
        return Double.compare(that.getPrice(), getPrice()) == 0 &&
                Objects.equals(getId(), that.getId()) &&
                Objects.equals(getCraeted_at(), that.getCraeted_at()) &&
                Objects.equals(getAppointment_date(), that.getAppointment_date()) &&
                Objects.equals(getName_of_doctor(), that.getName_of_doctor()) &&
                Objects.equals(status, that.status);
    }

    @Override
    public int hashCode() {

        return Objects.hash(getId(), getCraeted_at(), getAppointment_date(), getName_of_doctor(), status, getPrice());
    }

    @Override
    public String toString() {
        return "Appointment{" +
                "id = " + id +
                ", craeted_at = " + craeted_at +
                ", appointment_date = " + appointment_date +
                ", name_of_doctor='" + name_of_doctor + '\'' +
                ", status = " + status +
                ", price = " + price +
                '}';
    }
}




import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Status {

    @Column(name = "status")
    Boolean status;

    public Status() {
    }

    public Status(Boolean status) {
        this.status = status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }
}

Вызов API для PUT был изменен,

@PutMapping("/{id}/update")
    @JsonDeserialize(as = Boolean.class)
    public ResponseEntity<Appointment> updateAppointmentStatus(@PathVariable Long id, @RequestBody Status status) {

        Appointment appointment = service.findById(id).get();
        appointment.setStatus(status);

        service.save(appointment);
        return ResponseEntity.status(HttpStatus.ACCEPTED).body(appointment);
    }

Наконец, я делаю вызов с помощью cURL через терминал,

$ curl -X PUT -H "Content-Type: application/json" -d "{\"status\" : \"false\"}" http://localhost:8080/api/v1/appointments/1/update

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