Не работает конвертирование логического типа из Json в Srping Boot 2.x - PullRequest
1 голос
/ 05 марта 2020

Я использую Spring Boot 2.x и maven

  • pom. xml
     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

           <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
  • json, то есть отправка.
{
  "name": "fan",

  "isCar": true,

  "year": 2020,

  "character": "W",

  "cost": 10,

  "status": "OPEN"
}
  • часть DTO
public abstract class DifferentTypesDtoFour extends DifferentTypesDtoTwo {

    private Integer year;

    private boolean isCar;

    public DifferentTypesDtoFour() {
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public boolean isCar() {
        return isCar;
    }

    public void setCar(boolean car) {
        isCar = car;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
        DifferentTypesDtoFour that = (DifferentTypesDtoFour) o;
        return isCar == that.isCar &&
                Objects.equals(year, that.year);
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), year, isCar);
    }

    @Override
    public String toString() {
        return super.toString() + "\n" + "DifferentTypesDtoFour{" +
                "year=" + year +
                ", isCar=" + isCar +
                '}';
    }
}

Я не могу понять причину этой проблемы.

Когда запрос доходит до контроллера остальных, dto получает преобразованные данные.

Почти данные преобразуются корректно, но поле isCar = false ...

Почему?

У кого-нибудь есть идеи как это исправить?

Обновление

Я использовал следующее:


public abstract class DifferentTypesDtoFour extends DifferentTypesDtoTwo {

    private Integer year;

    private boolean isCar;

    public DifferentTypesDtoFour() {
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    @JsonProperty(value = "isCar")
    public boolean isCar() {
        return isCar;
    }

    @JsonProperty(value = "isCar")
    public void setCar(boolean car) {
        isCar = car;
    }
...

}

Тип логическое значение действительно сохранено, но когда данные возвращаются в rest-controller, клиент получает ответ, и тип boolean снова не преобразуется правильно.

1 Ответ

2 голосов
/ 05 марта 2020

Проблема связана с вашим сеттером из isCar поля - имя метода сеттера должно быть setIsCar вместо setCar, чтобы запрос json был Значение isCar может быть отображено в свойство isCar вашей модели,

public void setIsCar(boolean isCar) {
    this.isCar = isCar;
}

Edit 1 ... Как упомянул @Gimby, ваше имя getter должно быть isIsCar , это не повлияет на получение HTTP-запроса, но в конечном итоге для этого поля оно будет выглядеть просто getter - и вы можете переименовать вашу переменную, чтобы избежать проблем с опечатками.

Редактировать 2 .. . Одним из способов избавиться от проблемы является использование @ JsonProperty без переименования методов, как упомянуто @ GabLeg,

@JsonProperty(value="isCar")
public void setCar(boolean car) {
    this.isCar = car;
}
...