Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Jackson在自动生成的POJO枚举中忽略@JsonCreator注释?_Java_Json_Enums_Jackson_Jsonschema2pojo - Fatal编程技术网

Java 为什么Jackson在自动生成的POJO枚举中忽略@JsonCreator注释?

Java 为什么Jackson在自动生成的POJO枚举中忽略@JsonCreator注释?,java,json,enums,jackson,jsonschema2pojo,Java,Json,Enums,Jackson,Jsonschema2pojo,像往常一样,我的问题可能有一个非常简单的解决方案: 我有一个JSON模式片段,它定义了以下枚举: "title" : { "type": "string", "enum": ["Mr", "Miss", "Mrs", "Ms"], "description": "The person's title" } 然后,我公司的框架使用和maven创建必要的POJO(Title存在于Clazz,因为Title是JSON模式中Clazz的一部分-将Clazz作为一个名称-用员工

像往常一样,我的问题可能有一个非常简单的解决方案:

我有一个JSON模式片段,它定义了以下枚举:

"title" : {
    "type": "string",
    "enum": ["Mr", "Miss", "Mrs", "Ms"],
    "description": "The person's title"
 }
然后,我公司的框架使用和maven创建必要的POJO(
Title
存在于
Clazz
,因为
Title
是JSON模式中
Clazz
的一部分-将Clazz作为一个名称-用员工或客户或任何您喜欢的名称替换它):

生成的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;
        }
    }
}
我收到了一个错误

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"])
很明显,“Mr”在枚举中。

调试时,我可以看到它通过以下类(stack)运行:

看起来他们只对枚举的“键”感兴趣(即常量,例如“
MR
”而不是“
MR
”)。我猜由于某种原因,
@JsonCreator
注释被忽略了

知道如何解决这个问题吗? 是否存在可能导致此行为的任何位置设置的配置值?(我正在做一个大项目;如果我知道我需要寻找什么,我可以搜索代码库;可能是另一个开发人员在某处“错误配置”了某个东西……)或者问题可能是
Title
住在
Clazz
?我是否需要抛出一个
@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);

因此,我们的Spring配置中有以下内容:

<bean id="mapper" class="com.example.foo.jaxb.links.JsonMapper" />
<!-- ... -->
       <jaxrs:providers>
           <bean id="jsonprovider"
                 class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
               <constructor-arg ref="mapper" />
               <constructor-arg>
                   <value></value>
               </constructor-arg>
           </bean>
       </jaxrs:providers>
它几乎和tin上说的一样,它似乎阻止了Jackson评估
@JsonCreator
@JsonValue
注释。一旦“杰克逊注释抑制器”消失,一切都好了


我想做的是了解它实际上是如何工作的,因此如果有人有任何关于Spring内容或注释抑制的文档/操作指南/手册/书籍的有用链接,那将不胜感激。但与此同时,这解决了我的问题

鉴于您生成的类和另一个带有
标题
字段的简单Pojo类型,我无法复制此内容。
ObjectMapper mapper = new ObjectMapper(); // create once, reuse
Clazz value = mapper.readValue(new File("resources/data.json"), Clazz.class);
<bean id="mapper" class="com.example.foo.jaxb.links.JsonMapper" />
<!-- ... -->
       <jaxrs:providers>
           <bean id="jsonprovider"
                 class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
               <constructor-arg ref="mapper" />
               <constructor-arg>
                   <value></value>
               </constructor-arg>
           </bean>
       </jaxrs:providers>
// use JAXB annotations (only) 
setAnnotationIntrospector(new JaxbAnnotationIntrospector(
    com.fasterxml.jackson.databind.type.TypeFactory.defaultInstance()));