Как исправить UnrecognizedPropertyException с чтением из JSON? - PullRequest
0 голосов
/ 26 января 2020

У меня есть класс сущности:

@Entity
@Table(name = "meals")
public class Meal extends AbstractNamedEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @NotNull(message = "Price must be added")
    private Integer price;

    @JsonIgnore
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date = LocalDate.now();

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "restaurant_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Restaurant restaurant;

    public Meal() {
    }
    //getters and setters
}

Когда я тестирую свои контроллеры с тестовыми данными:

public class MealTestData {
    private static final Integer START_SEQ = 100000;

    public static final Meal MEAL_1 = new Meal(START_SEQ + 6, "ChickenBurger set", 300, RESTAURANT_1);
    public static final Meal MEAL_2 = new Meal(START_SEQ + 7, "CheeseBurger set", 400, RESTAURANT_1);
    public static final Meal MEAL_3 = new Meal(START_SEQ + 8, "FishBurger set", 500, RESTAURANT_1);
}

Я получаю это исключение:

java .lang.IllegalArgumentException: недопустимый массив чтения из JSON: '[{"id": 100006, "name": "ChickenBurger set", "price": 300, "date": "2020- 01-26 "}, {" id ": 100007," name ":" CheeseBurger set "," price ": 400," date ":" 2020-01-26 "}, {" id ": 100008," name ":" FishBurger set "," price ": 500," date ":" 2020-01-26 "}] ';

Причина: com.faster xml .jackson.databind.ex c .UnrecognizedPropertyException: нераспознанное поле «дата» (класс ru.top java .graduation.model.Meal), не помеченное как игнорируемое (3 известных свойства: «цена», «идентификатор», «имя»]) в [ Источник: (String) "[{" id ": 100006," name ":" ChickenBurger set "," price ": 300," date ":" 2020-01-26 "}, {" id ": 100007," name ":" CheeseBurger set "," price ": 400," date ":" 2020-01-26 "}, {" id ": 100008," name ":" FishBurger set "," price ": 500," дата ":" 2020-01-26 "}]"; строка: 1, столбец: 62] (через цепочку ссылок: ru.top java .graduation.model.Meal ["date"])

В чем причина и как ее исправить? Я не могу игнорировать это поле в моих тестах

И получатель, и установщик для поля "дата" представлены:

public LocalDate getDate() {
    return date;
}

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

1 Ответ

1 голос
/ 26 января 2020

У вас есть аннотация @JsonIgnore в поле 'date':

@JsonIgnore
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date = LocalDate.now();

, но это поле присутствует во входных данных json:

{"id":100006,"name":"ChickenBurger set","price":300,"date":"2020-01-26"},

Так что либо удалите генерацию значений по умолчанию, либо настройка переключателя для ObjectMapper выглядит следующим образом:

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
...