【发布时间】:2015-10-12 12:21:32
【问题描述】:
像往常一样,我的问题可能有一个非常简单的解决方案:
我有一个 JSON 架构 sn-p,它定义了以下枚举:
"title" : {
"type": "string",
"enum": ["Mr", "Miss", "Mrs", "Ms"],
"description": "The person's title"
}
然后我公司的框架使用 jsonschema2pojo 和 maven 创建必要的 POJO(Title 位于 Clazz,因为 title 是 JSON 模式中 clazz 的一部分 - 以 clazz 作为名称up - 用员工或客户或任何你喜欢的东西替换它):
生成的 POJO
@Generated("org.jsonschema2pojo")
public static enum Title {
MR("Mr"),
MISS("Miss"),
MRS("Mrs"),
MS("Ms");
private final String value;
private static Map<String, Clazz.Title> constants = new HashMap<String, Clazz.Title>();
static {
for (Clazz.Title c: values()) {
constants.put(c.value, c);
}
}
private Title(String value) {
this.value = value;
}
@JsonValue
@Override
public String toString() {
return this.value;
}
@JsonCreator
public static Clazz.Title fromValue(String value) {
Clazz.Title constant = constants.get(value);
if (constant == null) {
throw new IllegalArgumentException(value);
} else {
return constant;
}
}
}
当我针对它运行包含以下内容的请求时:
...
"title" : "Mr",
...
我收到了这个错误:
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of com.example.foo.representations.jaxb.Clazz$Title from String value 'Mr': value not one of declared Enum instance names: [Mr, Miss, Mrs, Ms] at [Source: org.apache.cxf.transport.http.AbstractHTTPDestination$1@1a372b7; line: 4, column: 3] (through reference chain: com.example.foo.representations.jaxb.MySchema["Clazz"]->com.example.foo.representations.jaxb.Clazz["title"])
显然,“先生”在枚举中。
在调试的时候,我可以看到它通过以下类(stack)运行:
findEnum():120, EnumResolver (com.fasterxml.jackson.databind.util)
deserialize():79, EnumDeserializer (com.fasterxml.jackson.databind.deser.std)
看起来他们只对 Enum 的“键”(即常量,例如“MR”而不是“Mr”)感兴趣。我猜@JsonCreator 注释由于某种原因被忽略了。
知道如何解决这个问题吗?
是否有可能在任何地方设置可能导致此行为的配置值? (我正在做一个大项目;如果我知道我需要寻找什么,我可以搜索代码库;也许另一个开发人员在某处“错误配置”了某些东西......)或者问题可能是 Title 住在 @ 987654335@?我是否需要输入@JsonProperty 才能获得良好的效果? (如果有,具体是怎样的?)
我们正在使用 jackson-core、-annotations 和 -databind 2.4.2。
更新:我将其作为一个独立项目进行了尝试,使用以下代码,并且它完美地工作 - 这意味着必须有某种设置可以防止注释被考虑在内...
ObjectMapper mapper = new ObjectMapper(); // create once, reuse
Clazz value = mapper.readValue(new File("resources/data.json"), Clazz.class);
【问题讨论】:
-
鉴于您生成的类和另一个带有
title字段的简单 Pojo 类型,我无法重现此内容。
标签: java json enums jackson jsonschema2pojo