InvalidFormatException for Date-在不使用JsonFormat的情况下进行修复,而无需修改原始类

问题描述 投票:0回答:2

简介

[我们正在使用一个托管在关系存储库中的自定义启动程序,该启动器包含向微服务发出请求的spring-cloud-feign客户端。

其中一个微服务将日期返回为“ dd-MM-yyyy HH:mm:ssZ”,这在我们的大多数应用程序中都有效。但是,我们有一个应用程序抛出以下错误:

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2019-10-16 14:23:17": not a valid representation (error: Failed to parse Date value '2019-10-16 14:23:17': Unparseable date: "2019-10-16 14:23:1
7")

当前解决方法

我当前的解决方法是,我不想污染启动程序,所以是扩展类并使用适当的JsonFormat创建本地的feign-client和本地的pojo:

public class DocumentMetaDataFix extends DocumentMetaData {
    @JsonFormat(
        shape = Shape.STRING,
        pattern = "yyyy-MM-dd HH:mm:ss"
    )
    private Date creationDate;
    @JsonFormat(
        shape = Shape.STRING,
        pattern = "yyyy-MM-dd HH:mm:ss"
    )

修复失败

我已经在我的配置类中尝试了以下内容,以尝试影响另一条路径的反序列化。但是,从未调用DocumentMetaDataSerializer。调用了ObjectMapper bean。

@Configuration
@EnableSpringDataWebSupport
@RequiredArgsConstructor
public class MyConfig extends WebMvcConfigurerAdapter {

@Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
        mapper.setDateFormat(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"));


        //mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, true);
        return mapper;
    }

    @Bean
    public Module dynamoDemoEntityDeserializer() {
        SimpleModule module = new SimpleModule();
        module.addDeserializer(DocumentMetaData.class, new DocumentMetaDataDeserializer());
        return module;
    }

    public static class DocumentMetaDataDeserializer extends JsonDeserializer<DocumentMetaData> {
        @Override
        public DocumentMetaData deserialize(JsonParser jp, DeserializationContext ctxt)
                throws IOException, JsonProcessingException {
            // return DynamoDemoEntity instance;

            JsonNode node = jp.getCodec().readTree(jp);


            return null;
        }

        public DocumentMetaData deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer t) throws IOException {
            JsonNode node = jp.getCodec().readTree(jp);


            return null;
        }

    }

完整堆栈跟踪

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2019-10-16 14:23:17": not a valid representation (error: Failed to parse Date value '2019-10-16 14:23:17': Unparseable date: "2019-10-16 14:23:1
7")
 at [Source: (ByteArrayInputStream); line: 1, column: 580] (through reference chain: eu.europa.ec.nova.documentstore.DocumentMetaData["creationDate"])
        at com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)
        at com.fasterxml.jackson.databind.DeserializationContext.weirdStringException(DeserializationContext.java:1548)
        at com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(DeserializationContext.java:910)
        at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:524)
        at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:467)
        at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:195)
        at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:285)
        at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:268)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3084)
        at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:237)
        ... 70 common frames omitted

有什么想法吗?我在整个项目中搜索了有关Jackson的引用,以防万一我的项目中有其他任何原因。]

我将尝试进入ObjectMapper并尝试从堆栈中调试ObjectMapper.java:3084上配置的当前参数/字段:

at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3084)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:237)
... 67 common frames omitted

简介我们正在使用一个托管在nexus存储库上的自定义启动程序,该存储库包含对微服务发出请求的spring-cloud-feign客户端。微服务之一将日期返回为“ ...

spring-boot jackson spring-cloud json-deserialization spring-cloud-feign
2个回答
0
投票

更新


0
投票

尝试使用LocalDateTime,这就是我正在为我做的工作

© www.soinside.com 2019 - 2024. All rights reserved.