我有一个日期/时间值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中的字符串。