Java FasterXml正确序列化,但不';无法在ZoneDateTime上调用反序列化

Java FasterXml正确序列化,但不';无法在ZoneDateTime上调用反序列化,java,json,json-deserialization,mapper,Java,Json,Json Deserialization,Mapper,我正在进行一个需要快速XML和ZoneDateTime的项目。必须避免使用注释,如using=Deserializer.class,因为我们希望在所有项目上保持相同的日期格式 也就是说,我来这里寻求帮助,因为我不明白为什么我的反序列化程序是instanceate,但它的方法deserialize()不是call 以下是我的配置: 序列化程序: public class ZonedDateTimeSerializer extends JsonSerializer<ZonedDateTime&

我正在进行一个需要快速XML和ZoneDateTime的项目。必须避免使用注释,如
using=Deserializer.class
,因为我们希望在所有项目上保持相同的日期格式

也就是说,我来这里寻求帮助,因为我不明白为什么我的反序列化程序是instanceate,但它的方法
deserialize()
不是call

以下是我的配置:

序列化程序:

public class ZonedDateTimeSerializer extends JsonSerializer<ZonedDateTime> {

    /**
     * The date time formatter to use
     */
    DateTimeFormatter dtf;

    /**
     * Instanciate a new serializer
     *
     * @param dtf The datetime formatter
     */
    public ZonedDateTimeSerializer(DateTimeFormatter dtf) {
        System.out.println("ZonedDateTimeSerializer()");
        this.dtf = dtf;
    }


    @Override
    public void serialize(ZonedDateTime dateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        System.out.println("ZonedDateTimeSerializer::serialize()");
        if (null != dateTime) {
            jsonGenerator.writeString(dateTime.format(dtf));
        }
    }
}
public class ZonedDateTimeDeserializer extends JsonDeserializer<ZonedDateTime> {

    /**
     * The date time formatter to use
     */
    DateTimeFormatter dtf;

    /**
     * Instanciate a new deserializer
     *
     * @param dtf The datetime formatter
     */
    public ZonedDateTimeDeserializer(DateTimeFormatter dtf) {
        Preconditions.checkNotNull(dtf, "Date time formatter is null");
        System.out.println("ZonedDateTimeDeserializer()");
        this.dtf = dtf;
    }

    @Override
    public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        System.out.println("ZonedDateTimeDeserializer::deserialize()");
        return ZonedDateTime.parse(jsonParser.getText(), dtf);
    }
}
在测试正常之前,我无法在生产或开发中测试它。所以我做了如下测试:

public class xxxTest extends JerseyTest {
    ...
    @Override
    protected Application configure() {
        ...
        ResourceConfig config = new ResourceConfig(...);

        config.register(new JacksonConfigurator());

        return config;
    }

    @Test
    public void xxx() {
        ...
        response.bufferEntity();
        response.readEntity(EntityWithZonedDateTime.class);
        ...
    } 
}
当我在每个ZonedDateTime属性上使用注释
@JsonDeserializer
时,它工作得很好,但现在,
序列化器
构造函数被记录,
序列化()
也被记录,事件
反序列化器
构造函数被记录,而不是
反序列化()
方法

相反,我有:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class java.time.ZonedDateTime] from String value ('2012-06-30T12:30:40.000+0000'); no single-String constructor/factory method
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@3af4e0bf; line: 1, column: 46] (through reference chain: com.xxx.xxx.resources.utils.Xxxx["beginDate"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:843)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:277)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:284)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1150)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:153)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:144)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1408)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:858)
at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:777)
下午2点,我就要48小时了。不可能知道为什么映射程序不尝试使用反序列化程序进行去序列化,而它会在字符串上回退。猜猜看。。。FasterXMLWiki已关闭。。。欢迎提供任何线索

---编辑---

有关信息,请求中发送的实体如下所示:

@XmlRootElement
public class XxxOutput {

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public static class XxxJson {

        /* ---------- Properties ---------- */
        public BigInteger id;

        public String name;

        public String definition;

        public ZonedDateTime beginDate;

        public ZonedDateTime endDate;

        public ZonedDateTime creationDate;

        public ZonedDateTime lastUpdate;

        public Map<String, BigInteger> relateds;

        /* ---------- Constructor ---------- */
        public XxxJson() {}

        public XxxJson(... all args ...) {
            this.id = id;
            ...
            this.relateds = relateds;
        }
        /* ---------- Useful methods ---------- */
        public XxxJson addRelated(final Xxx related) {
            ...
            // add the Xxx.id to the list
            ...
        }

        @Override
        public String toString() {
            return id.toString();
        }
    }
 }
@XmlRootElement
公共类XXX输出{
@JsonInclude(JsonInclude.Include.NON_EMPTY)
公共静态类XxxJson{
/*-------属性--------*/
公共双整数id;
公共字符串名称;
公共字符串定义;
公共分区日期开始时间;
公共分区日期结束日期;
公共区域DateTime creationDate;
公共分区日期最新更新;
公共地图相关;
/*-------构造函数--------*/
公共XxxJson(){}
公共XxxJson(…所有参数…){
this.id=id;
...
this.relateds=relateds;
}
/*-------有用的方法--------*/
公共XxxJson addRelated(最终Xxx相关){
...
//将Xxx.id添加到列表中
...
}
@凌驾
公共字符串toString(){
返回id.toString();
}
}
}

您是否尝试过简单地使用?它是可以使用的。不要重新发明轮子。是的,谢谢,这可能是个好主意,但我们必须与其他API进行通信,日期格式必须是:
yyyy-MM-dd'HH:MM:ss.SSSZ
,我想我不能用
new JSR310Module()
:这似乎是问题的一个相当关键的部分,不?我链接的模块是开源的。再次感谢Boris,我会尝试一下,但我真的认为问题在于jersey测试中的Bellow代码的集成。用一些词来形容这个问题。是的,你是对的,我应该强调问题中的格式问题。
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class java.time.ZonedDateTime] from String value ('2012-06-30T12:30:40.000+0000'); no single-String constructor/factory method
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@3af4e0bf; line: 1, column: 46] (through reference chain: com.xxx.xxx.resources.utils.Xxxx["beginDate"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:843)
at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:277)
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:284)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1150)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:153)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:144)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101)
at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1408)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:858)
at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:777)
@XmlRootElement
public class XxxOutput {

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    public static class XxxJson {

        /* ---------- Properties ---------- */
        public BigInteger id;

        public String name;

        public String definition;

        public ZonedDateTime beginDate;

        public ZonedDateTime endDate;

        public ZonedDateTime creationDate;

        public ZonedDateTime lastUpdate;

        public Map<String, BigInteger> relateds;

        /* ---------- Constructor ---------- */
        public XxxJson() {}

        public XxxJson(... all args ...) {
            this.id = id;
            ...
            this.relateds = relateds;
        }
        /* ---------- Useful methods ---------- */
        public XxxJson addRelated(final Xxx related) {
            ...
            // add the Xxx.id to the list
            ...
        }

        @Override
        public String toString() {
            return id.toString();
        }
    }
 }