Я получаю последний заказ от FindOrderResponseType. Затем я пытаюсь преобразовать JAXBElement в строку. Но почему-то я получаю все записи, игнорируя последнюю запись, которую я отфильтровал изначально.
<code> public GetOrderResponseType findOrderBySoloOrderId(String soloOrderId) {
log.info("Entering findOrderBySoloOrderId for OSMClient..." );
FindOrderRequestType findOrderRequestType = new FindOrderRequestType();
ViewBy viewBy = new ViewBy();
String view = "COMOrchestrationCreationTask";
viewBy.getView().add(view);
findOrderRequestType.setViewBy(viewBy);
SelectBy selectBy = new SelectBy();
selectBy.setOrderType("CharterNG_COM_OrchestrationOrder");
Field field = new Field();
field.setPath("/Order/OrderInfo/SoloOrderId");
field.setEqualTo(soloOrderId);
selectBy.getField().add(field);
findOrderRequestType.setSelectBy(selectBy);
//ObjectMapper mapper = new ObjectMapper();
GetOrderResponseType latestOrder = new GetOrderResponseType();
try {
//mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//String findOrderResponseTypeStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(getOSMService(osmServiceUrl).findOrder(findOrderRequestType));
FindOrderResponseType findOrderResponseType =
getOSMService(osmServiceUrl).findOrder(findOrderRequestType);
List<GetOrderResponseType> orders = findOrderResponseType.getOrder();
Comparator<GetOrderResponseType> cmp = new Comparator<GetOrderResponseType>() {
@Override
public int compare(GetOrderResponseType getOrderResponseType1, GetOrderResponseType getOrderResponseType2) {
return getOrderResponseType1.getOrderSummary().getCreatedDate().toGregorianCalendar().compareTo(getOrderResponseType2.getOrderSummary().getCreatedDate().toGregorianCalendar());
}
};
latestOrder = Collections.max(orders, cmp);
log.info("order = " + latestOrder.getOrderSummary().getId());
List<Object> objs = latestOrder.getData().getAny();
for (Object obj : objs) {
Node node = (Node)obj;
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(node),
new StreamResult(buffer));
String str = buffer.toString();
log.info("Printing obj in string = " + str);
final Pattern pattern = Pattern.compile("<msg(.+?)</msg>", Pattern.DOTALL);
final Matcher matcher = pattern.matcher(str);
matcher.find();
log.info(matcher.group(1));
String msgStr = "<msg" + matcher.group(1) + "</msg>" ;
log.info("message string = " + msgStr);
}
return latestOrder;
} catch (FindOrderFaultMsg1 e) {
throw new OSMException("TOS_ORD_10011 :: "+e.getMessage(),e);
} catch (FindOrderFaultMsg2 e) {
throw new OSMException("TOS_ORD_10011 :: "+e.getMessage(),e);
}
/*
catch (JsonProcessingException e) {
//e.printStackTrace();
throw new OSMException("Failed to remove null values from FindResponseType..." + e);
} */ catch (TransformerException e) {
throw new IllegalStateException(e);
}
}
Here is OrderDataType class.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OrderDataType", propOrder = {
"any"
})
public class OrderDataType {
@XmlAnyElement(lax = true)
protected List<Object> any;
/**
* Gets the value of the any property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the any property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAny().add(newItem);
*
* * *
* В списке разрешены объекты следующих типов * * {@link Object} * {@link Element} * * * / publi c Список getAny () {if (any == null) {any = new ArrayList (); } вернуть this.any; }}
Я хотел бы получить последнюю информацию о заказе в String, чтобы позже я мог проанализировать часть сообщения.