JAVA-JSON将枚举列表序列化为类

JAVA-JSON将枚举列表序列化为类,java,json,hibernate,Java,Json,Hibernate,我有这个枚举: public enum Days implements Serializable { MONDAY, TUESDAY, WEDNESDAY, ... } 我想在商店类中使用它: public class Store{ private integer id_store; private String name; private Days days_visit; } 问题是,days\u visit需要是一个数

我有这个枚举:

public enum Days implements Serializable {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    ...
}
我想在商店类中使用它:

 public class Store{
      private integer id_store;
      private String name;
      private Days days_visit;
}
问题是,
days\u visit
需要是一个数组,因为它可以超过一天;在数据库端,Days类型是Days类型:

CREATE TYPE schema.days AS ENUM
   (MONDAY,
    TUESDAY,
    WEDNESDAY,
    ...);
表存储有一个“天”数组

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"])
如果我在课堂上像这样宣布访问日期:

 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;"}}

有什么我遗漏的吗?

问题似乎是反序列化JSON

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化org.domain.Days的实例

Jackson无法反序列化枚举。您可以编写自定义反序列化器方法,并使用
@JsonCreator
对其进行注释

根据您的需求/约束调整以下逻辑

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;
    }
}
公共枚举天数{
星期一(“星期一”)、星期二(“星期二”)、星期三(“星期三”);
天数(字符串值){
这个值=值;
}
私有字符串值;
@JsonCreator
公共静态天数[]创建(@JsonProperty(“Days\u visit”)字符串[]天){
天数[]天\就诊天数=新天数[天数.长度];
对于(int i=0;i
如果无法向枚举添加值,则在这种情况下可以创建自定义查找映射

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;
    }
}
公共枚举天数{
星期一、星期二、星期三;
静态映射daysLookup=newhashmap();
静止的{
daysLookup.put(“周一”,周一);
daysLookup.put(“星期二”,星期二);
daysLookup.put(“星期三”,星期三);
}
@JsonCreator
公共静态天数[]创建(@JsonProperty(“Days\u visit”)字符串[]天){
天数[]天\就诊天数=新天数[天数.长度];
对于(int i=0;i
如果您不想污染您的域,您也可以使用来实现这一点。