Я хочу сериализовать неизменяемый тип как json, так и как xml:
Сериализованный JSON похож:
{
"text" : "... the text..."
}
и сериализованный xml выглядит так:
<asText>_text_</asText>
(обратите внимание, что текст представляет собой текст элемента xml)
Объект java выглядит как:
@JsonRootName("asText")
@Accessors(prefix="_")
public static class AsText {
@JsonProperty("text") @JacksonXmlText
@Getter private final String _text;
public AsText(@JsonProperty("text") final String text) {
_text = text;
}
}
остерегайтесь, что свойство _text final (поэтому объект неизменен), и он аннотируется с помощью @JacksonXmlText
, чтобы быть сериализованным как текст элемента xml
Будучи объектом неизменяемым, требуется конструктор из текста, и аргумент конструктора должен быть аннотирован с помощью @JsonProperty
public AsText(@JsonProperty("text") final String text) {
_text = text;
}
При сериализации/десериализации в/из JSON все работает отлично ... проблема возникает при сериализации/десериализации в/из XML:
// create the object
AsText obj = new AsText("_text_");
// init the mapper
XmlMapper mapper = new XmlMapper();
// write as xml
String xml = mapper.writeValueAsString(obj);
log.warn("Serialized Xml\n{}",xml);
// Read from xml
log.warn("Read from Xml:");
AsText objReadedFromXml = mapper.readValue(xml,
AsText.class);
log.warn("Obj readed from serialized xml: {}",
objReadedFromXml.getClass().getName());
Исключение составляет:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "" (class r01f.types.url.UrlQueryStringParam), not marked as ignorable (2 known properties: "value", "name"])
Кажется, что для модуля xml требуется, чтобы конструктор объекта был аннотирован следующим образом:
public AsText(@JsonProperty("") final String text) {
_text = text;
}
НО это НЕ РАБОТАЕТ:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `test.types.SerializeAsXmlElementTextTest$AsText` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Аннотации @JsonProperty("text")
в аргументе конструктора необходимы для десериализации из JSON
... как я могу заставить это работать