Моя строка ввода XML содержит список записей. Когда я десериализую его в объект с помощью jackson xmlmapper, я вижу только один элемент в списке. Родительские элементы были определены как общие объекты в POJO.Полный список элементов не отображается после десериализации XML-строки в объект с использованием XML-преобразователя Jackson
XML-строка (ITEMLIST содержит 3 элемента):
<msg>
<head>
<Client>MyClient</Client>
<RoutingArea>Test</RoutingArea>
<ServerId>ABCXYZ123</ServerId>
</head>
<body>
<UserDetailResponse>
<UserDetail>
<Customer>
<CustomerId>1456342711975</CustomerId>
<BusinessUnit>TEST0000</BusinessUnit>
<Name>
<Salutation>U</Salutation>
<First>TROPICAL TAN</First>
</Name>
<Privacy>Y</Privacy>
</Customer>
<ItemList>
<Count>3</Count>
<Item>
<ServiceIdentifier>000001</ServiceIdentifier>
<BillingIdentifier>000001</BillingIdentifier>
</Item>
<Item>
<ServiceIdentifier>000002</ServiceIdentifier>
<BillingIdentifier>000002</BillingIdentifier>
</Item>
<Item>
<ServiceIdentifier>000003</ServiceIdentifier>
<BillingIdentifier>000003</BillingIdentifier>
</Item>
</ItemList>
</UserDetail>
</UserDetailResponse>
</body>
</msg>
Java-код:
private final static XmlMapper mapper = new XmlMapper();
public static <T> T getXmlObject(String xml, Class<T> cls) throws IOException {
return mapper.readValue(xml, cls);
}
public static void main(String[] args) throws Exception {
String xmlString = "<msg><head><Client>MyClient</Client><RoutingArea>Test</RoutingArea><ServerId>ABCXYZ123</ServerId></head><body><UserDetailResponse><UserDetail><Customer><CustomerId>1456342711975</CustomerId><BusinessUnit>TEST0000</BusinessUnit><Name><Salutation>U</Salutation><First>TROPICAL TAN</First></Name><Privacy>Y</Privacy></Customer><ItemList><Count>3</Count><Item><ServiceIdentifier>000001</ServiceIdentifier><BillingIdentifier>000001</BillingIdentifier></Item><Item><ServiceIdentifier>000002</ServiceIdentifier><BillingIdentifier>000002</BillingIdentifier></Item><Item><ServiceIdentifier>000003</ServiceIdentifier><BillingIdentifier>000003</BillingIdentifier></Item></ItemList></UserDetail></UserDetailResponse></body></msg>";
JacksonXmlModule jacksonXmlModule = new JacksonXmlModule();
jacksonXmlModule.setDefaultUseWrapper(false);
MyResponse myResponse = getXmlObject(xmlString, MyResponse.class);
System.out.println("XML Object: \n" + myResponse.toString());
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myResponse);
System.out.println("JSON : \n" + str);
}
POJO:
public class MyResponse {
private Object head;
private Object body;
public Object getHead() {
return head;
}
public void setHead(Object head) {
this.head = head;
}
public Object getBody() {
return body;
}
public void setBody(Object body) {
this.body = body;
}
}
Хотя есть 3 пунктов под ITEMLIST во входном XML string объект результата содержит только 3-й элемент.
Результат:
JSON :
{
"head" : {
"Client" : "MyClient",
"RoutingArea" : "Test",
"ServerId" : "ABCXYZ123"
},
"body" : {
"UserDetailResponse" : {
"UserDetail" : {
"Customer" : {
"CustomerId" : "1456342711975",
"BusinessUnit" : "TEST0000",
"Name" : {
"Salutation" : "U",
"First" : "TROPICAL TAN"
},
"Privacy" : "Y"
},
"ItemList" : {
"Count" : "3",
"Item" : {
"ServiceIdentifier" : "000003",
"BillingIdentifier" : "000003"
}
}
}
}
}
}
Хм .. Мне нужно будет изменить подход. JSON - это вход для моего приложения. С Spring web я получаю pojo, а затем конвертирую его в xml для вызова внешнего интерфейса. XML-ответ внешнего интерфейса преобразуется в pojo. Раньше в проблему с несколькими элементами. Спасибо за быстрый ответ! – Sparkle8
У меня есть XSD для входящего запроса, поэтому решение будет генерировать pojo из xsd (с использованием cxf), а затем использовать это pojo для сериализации/десериализации xml с помощью XmlMapper. Любое другое лучшее решение? – Sparkle8
Я подозреваю, что определение типа в XSD недостаточно полно, чтобы дать реальные типы? Я не знаю, почему это создаст «Объект». Но без реального типа контента не удастся десериализовать содержимое; сериализация может работать. – StaxMan