MismatchInputException при десериализации строки в ZonedDateTime с использованием Джексона - PullRequest
0 голосов
/ 08 марта 2019

У меня есть значение даты / времени, openDtGmt, которое является частью входных данных XML из устаревшей системы и не может быть изменено. Пример даты / времени: 2019 3 4 14 44 20 -5 Я использую Джексона, чтобы отобразить XML в объект. Я создал собственный класс Deserialize для сопоставления этой строки с объектом ZonedDateTime. При запуске юнит-теста я получаю ошибку:

com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно построить экземпляр com.fedex.ground.tms.javaserver.dock.closetrailer.model.StandardLoadComposite (хотя существует хотя бы один Создатель): нет аргумента String метод конструктора / фабрики для десериализации из строкового значения ('2019 3 4 14 44 20 -5 ')

Эта дата находится в классе TrailerLoad, который является частью 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 не имеет конструктора для строки даты. Дата фактически находится в классе TrailerLoad, который находится в StandardLoadComposite. Я не понимаю, как создать конструктор для поля даты, которое представляет собой строку в XML для ZonedDateTime в классе TrailerLoad.

...