我有这个枚举:
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_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"])
如果我在我的类(class)中像这样声明 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, 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[] daysVisit = new Days[days.length];
for (int i = 0; i < days.length; i++) {
daysVisit[i] = daysLookup.get(days[i]);
}
return daysVisit;
}
}
关于JAVA - JSON 将枚举列表序列化为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59951249/