Создайте и маршалируйте корневой элемент следующим образом:
JAXBElement<Payment> jbe;
if( payment.getResponse() != null ){
jbe = wrap( null, "PaymentResponse", payment );
} else {
jbe = wrap( null, "PaymentRequest", payment );
}
m.marshal( jbe, sw );
с помощью простого вспомогательного метода
<T> JAXBElement<T> wrap( String ns, String tag, T o ){
QName qtag = new QName( ns, tag );
Class<?> clazz = o.getClass();
@SuppressWarnings( "unchecked" )
JAXBElement<T> jbe = new JAXBElement( qtag, clazz, o );
return jbe;
}
Простой способ сделать возможным демаршаллинг — создать два подкласса PaymentResponse и PaymentRequest, которые действуют как @XmlRootElements. Объектная фабрика содержит
@XmlElementDecl(namespace = "", name = "PaymentRequest")
public JAXBElement<PaymentRequest>
createPaymentRequest(PaymentRequest value) {
return new JAXBElement<PaymentRequest>(_Payment_QNAME, PaymentRequest.class, null, value);
}
@XmlElementDecl(namespace = "", name = "PaymentResponse")
public JAXBElement<PaymentResponse>
createPaymentResponse(PaymentResponse value) {
return new JAXBElement<PaymentResponse>(_Payment_QNAME, PaymentResponse.class, null, value);
}
Демаршаллинг:
JAXBContext jc = JAXBContext.newInstance( PACKAGE );
Unmarshaller m = jc.createUnmarshaller();
JAXBElement<?> tb = null;
try {
Payment payment = readFrom( Payment.class );
} catch( Exception e ){
}
и метод readFrom:
public <T> T readFrom( Class<T> type ) throws Exception {
try {
JAXBContext jc = JAXBContext.newInstance( PACKAGE );
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<T> jbe = (JAXBElement<T>)u.unmarshal( new File( XMLIN ) );
return type.cast( jbe.getValue() );
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
person
laune
schedule
14.10.2015