Если XML
полезная нагрузка содержит рекурсивную структуру, вам нужно создать аналогичные Java
POJO
классовые модели. Все значения могут расширяться одинаково interface
или abstract class
. Взгляните на пример модели ниже:
@JsonTypeName("map-type")
class Root {
@JacksonXmlProperty(localName = "entry")
@JacksonXmlElementWrapper(localName = "entries")
private List<Entry> entries;
public List<Entry> getEntries() {
return entries;
}
public void setEntries(List<Entry> entries) {
this.entries = entries;
}
}
@JsonTypeInfo(include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type", use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
@JsonSubTypes.Type(name = "xs:string", value = StringType.class),
@JsonSubTypes.Type(name = "jaxbMap", value = MapType.class)
})
interface JBPMValue {
}
class StringType implements JBPMValue {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@JsonAnySetter
public void anySetter(String key, String value) {
this.value = value.trim();
}
@Override
public String toString() {
return value;
}
}
class MapType implements JBPMValue {
@JacksonXmlProperty(localName = "entry")
@JacksonXmlElementWrapper(localName = "entries")
private List<Entry> entries;
public List<Entry> getEntries() {
return entries;
}
public void setEntries(List<Entry> entries) {
this.entries = entries;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("MapType{");
sb.append(System.lineSeparator());
entries.forEach(e -> sb.append(e.toString()).append(System.lineSeparator()));
sb.append('}');
return sb.toString();
}
}
class Entry {
private String key;
private JBPMValue value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public JBPMValue getValue() {
return value;
}
public void setValue(JBPMValue value) {
this.value = value;
}
@Override
public String toString() {
return "{" + key + "=" + value + "}";
}
}
Как вы можете видеть, я использовал @JsonTypeInfo
и @JsonSubTypes
, чтобы определить POJO
классы для каждого типа в XML
. Аннотации @JacksonXmlProperty
и @JacksonXmlElementWrapper
используются для представления упакованных коллекций.
Теперь мы можем создать простой пример его использования:
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import java.io.File;
import java.util.List;
public class XmlMapperApp {
public static void main(String... args) throws Exception {
File xmlFile = new File("./resource/test.xml").getAbsoluteFile();
XmlMapper mapper = XmlMapper.xmlBuilder().build();
Root root = mapper.readValue(xmlFile, Root.class);
root.getEntries().forEach(System.out::println);
}
}
Над кодом для вашей XML
полезной нагрузки отпечатки:
{document=MapType{
{org.jbpm.document.service.impl.DocumentImpl=MapType{
{identifier=fc3a87c9-d22c-449b-b772-756fcc9a385d}
{size=1186}
{name=dmv-registration.txt}
{link=fc3a87c9-d22c-449b-b772-756fcc9a385d}
{attributes=null}
{lastModified=Mon Mar 09
18:19:25 PDT 2020}
{content=null}
}}
{uploader_name=murthy}
{uploader_mail=gandikotam@gmail.com}
}}
{initiator=kieserver}