У меня есть значение даты / времени, 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.