使用Jackson将字符串反序列化为ZonedDateTime时出现MismatchInputException

时间:2019-03-08 01:20:03

标签: java jackson-dataformat-xml

我有一个日期/时间值openDtGmt,它是无法更改的旧系统xml输入的一部分。 日期/时间的示例: 2019 3 4 14 44 20 -5 我正在使用Jackson将xml映射到对象中。 我创建了一个自定义的Deserialize类,以将该字符串映射到ZonedDateTime对象。 运行单元测试时出现错误:

  

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法   构造的实例   com.fedex.ground.tms.javaserver.dock.closetrailer.model.StandardLoadComposite   (尽管至少存在一个创建者):没有字符串参数   从字符串值反序列化的构造函数/工厂方法('2019 3 4   14 44 20 -5')

此日期在TrailerLoad类中,该类属于StandardLoadComposite的一部分,而StandardLoadComposite是父类CloseTrailerXml的一部分 这是类:

class CloseTrailerXml {
@JacksonXmlElementWrapper(localName = "trailer_standard_loads", useWrapping = true)
List<StandardLoadComposite> trailer_standard_loads;

...other classes
}

@JsonIgnoreProperties(ignoreUnknown=true)
public class StandardLoadComposite {

    public StandardLoadComposite(){}

    @JsonUnwrapped
    private TrailerLoad trailerload;

...other classes
}

@JsonRootName("trailer_standard_loads")
@JsonIgnoreProperties(ignoreUnknown=true)
public class TrailerLoad {

    private Integer trailerLoadSeq;
    @JsonProperty("open_dt_gmt") //this is the datetime deserialized
    private ZonedDateTime openDtGmt;
...other member variables
}

现在反序列化器:

public class ZonedDateTimeDeserializer extends JsonDeserializer<ZonedDateTime> {

     protected final Log log = LogFactory.getLog(TMSTransactionBean.class.getName());

    @Override
      public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctx)
              throws IOException {
          String dateTimeString = p.getText();

          try {
            ..string manipulation...
              dateTimeFromString = ZonedDateTime.parse(formattedDateTimeString);
              return dateTimeFromString;
          } catch (DateTimeParseException e) {
              log.error("Error deserializing the date from scanner xml message: " + e.getMessage());
              return null;
          }
      }

这是将xml映射到对象的调用:

 //creating a module
SimpleModule module = new SimpleModule();
  module.addDeserializer(ZonedDateTime.class, new ZonedDateTimeDeserializer());

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(new JavaTimeModule());
xmlMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
xmlMapper.registerModule(module);

xmlMapper.setSerializationInclusion(Include.NON_NULL);

CloseTrailerXml closeTrailerXml = xmlMapper.readValue(message, CloseTrailerXml.class);

我只想反序列化TrailerLoad类中的一个字段。错误是StandardLoadComposite类没有日期字符串的构造函数。该日期实际上位于StandardLoadComposite中的TrailerLoad类中。 我不了解如何为Date字段创建构造函数,该构造函数是TrailerLoad类中ZonedDateTime的xml中的字符串。

0 个答案:

没有答案