JAVA - JSON Сериализация списка перечислений для класса - PullRequest
0 голосов
/ 28 января 2020

У меня есть это перечисление:

public enum Days implements Serializable {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    ...
}

Я хочу использовать его в классе Store:

 public class Store{
      private integer id_store;
      private String name;
      private Days days_visit;
}

Дело в том, что days_visit должен быть массивом, потому что это может быть более одного дня; на стороне базы данных тип Days является типом days:

CREATE TYPE schema.days AS ENUM
   (MONDAY,
    TUESDAY,
    WEDNESDAY,
    ...);

И таблица Stores имеет массив'days´

days_visit schema.days[],

Как можно сериализовать это в JSON? JSON Я пытался это:

{"id_store":"1", "name":"The Store", "days_visit":["MONDAY", "FRIDAY"]}

Но я получаю эту ошибку:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.domain.Days
    out of START_ARRAY token
    at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@5c2a7de1; line: 1, column: 168] (through reference chain:
    org.Stores["days_visit"])

Если я объявлю days_visit следующим образом в моем классе:

 public class Store{
      private integer id_store;
      private String name;
      private Days[] days_visit;
}

Я получаю эту ошибку при развертывании в Wildfly:

[2020-01-28 11:42:09,970] Artifact app:war: Error during artifact deployment. See server log for details.
    [2020-01-28 11:42:09,970] Artifact app:war: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"app.war#org\"" => "javax.persistence.PersistenceException: [PersistenceUnit: org_app] Unable to build Hibernate SessionFactory
        Caused by: javax.persistence.PersistenceException: [PersistenceUnit: org.app] Unable to build Hibernate SessionFactory
        Caused by: org.hibernate.MappingException: Unable to instantiate custom type: org.hibernate.type.EnumType
        Caused by: java.lang.ClassCastException: class [Lpy.org.app.domain.Days;"}}

Что-то мне не хватает?

1 Ответ

0 голосов
/ 28 января 2020

Кажется, проблема в десериализации JSON.

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.domain.Days

Джексон не может десериализовать перечисление. Вы можете написать собственный метод десериализатора и аннотировать его с помощью @JsonCreator.

Настройка ниже logi c в соответствии с вашими требованиями / ограничениями.

public enum Days {
    MONDAY("MONDAY"), TUESDAY("TUESDAY"), WEDNESDAY("WEDNESDAY");

    Days(String value) {
        this.value = value;
    }

    private String value;

    @JsonCreator
    public static Days[] create(@JsonProperty("days_visit") String[] days) {
        Days[] days_visit = new Days[days.length];
        for (int i = 0; i < days.length; i++) {
            String currentDay = days[i];
            for (Days day : values()) {
                if (currentDay.equals(day.getValue())) {
                    days_visit[i] = day;
                }
            }
        }
        return days_visit;
    }

    public String getValue() {
        return value;
    }
}

Если вы не можете добавить значения в enum , то в таком случае вы можете создать пользовательскую карту поиска.

public enum Days {
    MONDAY, TUESDAY, WEDNESDAY;
    static Map<String, Days> daysLookup = new HashMap<>();

    static {
        daysLookup.put("MONDAY", MONDAY);
        daysLookup.put("TUESDAY", TUESDAY);
        daysLookup.put("WEDNESDAY", WEDNESDAY);
    }


    @JsonCreator
    public static Days[] create(@JsonProperty("days_visit") String[] days) {
        Days[] days_visit = new Days[days.length];
        for (int i = 0; i < days.length; i++) {
            String currentDay = days[i];
            days_visit[i] = daysLookup.get(currentDay);
        }
        return days_visit;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...