2011-12-15 15 views
5

Sto cercando di schierare un file utilizzando il Visio XML Schema, che si compone di 3 file di schema e produce tre pacchetti quando la sorgente di Java è generato con XJC:JAXB è confuso sugli elementi root?

  • com.microsoft.schemas.visio._2003.core
  • com.microsoft.schemas.visio._2006.extension
  • com.microsoft.schemas.office.visio._2010.extension

L'elemento principale è VisioDocument, e tutte le classi sto usando sono nelloPacchetto.

Ecco il mio approccio per il dispiegamento di mio file XML:

VisioDocumentType visioDoc = new VisioDocumentType(); 
... manipulated here ... 
JAXBContext jc = JAXBContext.newInstance("com.microsoft.schemas.visio._2003.core"); 
Marshaller m = jc.createMarshaller(); 
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
m.marshal(new JAXBElement<VisioDocumentType>(new QName("uri","local"), VisioDocumentType.class, visioDoc), bw); 

Quando viene eseguito, ricevo questo errore:

javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.internal.SAXException2: unable to marshal type "com.microsoft.schemas.visio._2003.core.PagePropsType" as an element because it is missing an @XmlRootElement annotation] 

Sto usando PagePropsType, ma non è un elemento radice. Perché JAXB pensa che sia?

+0

Come è la proprietà che si sta configurando l'istanza di 'com.microsoft.schemas.visio._2003.core.PagePropsType' sul annotato ? –

+0

'@XmlAccessorType (XmlAccessType.CAMPO) @XmlType (name = "PageProps_Type", propOrder = { "pageWidthOrPageHeightOrShdwOffsetX" }) "È quello che stai cercando? – Chris

+0

Intendevo la proprietà su cui si sta impostando l'istanza e non il 'PagePropsType' stesso. –

risposta

2

Il problema si trova nella parte ... manipulated here ... del codice.

Basato sul presupposto che si esegua quanto segue (o qualcosa di simile).

// you create a page prop 
PagePropsType pageProps = ... 

// then you feed it to a shape sheet 
ShapeSheetType shapeSheet = ... 
shapeSheet.getTextOrXFormOrLine().add(pageProps); 

(ShapeSheetType è una superclasse per StyleSheetType, eccetera.)

Se questo è il caso, allora il problema sta nella aggiungendo il pageProps alla lista direttamente.

Se si dà un'occhiata alla documentazione del metodo getTextOrXFormOrLine(), viene elencato il tipo di tipi che l'elenco può contenere. Ogni tipo è racchiuso in un JAXBElement<...> quindi è necessario avvolgere lo pageProps prima di aggiungerlo all'elenco.

Si dovrebbe fare in questo modo:

ObjectFactory objectFactory = new ObjectFactory(); 
JAXBElement<PagePropsType> pagePropsElement = objectFactory.createShapeSheetTypePageProps(pageProps); 

(Si noti che ho usato XJC 2.2.4 per compilare gli schemi; per me ogni nome di classe è suffisso Type Forse questo è il motivo. ho finito con VisioDocumentType invece di VisioDocument come te, ma non dovrebbe importare.)

+0

Questo sembra essere quello che mi mancava, grazie. (la mancanza di 'Type' era un refuso) – Chris

1

Se si controlla il codice generato, è possibile trovare una classe ObjectFactory. Questa classe dovrebbe avere un metodo che restituisce un VisioDocument avvolto in un JAXBElement e che è l'oggetto che si desidera passare al marshaller.

Stesso applicabile a tutti gli oggetti impostati all'interno di VisioDocument - non crearli con "new" ma utilizzare ObjectFactory.

+0

Ho fatto questo, ma i problemi rimangono. – Chris

+0

_Some applicabile a tutti gli oggetti impostati all'interno di VisioDocument - non crearli con 'new' ma utilizzare ObjectFactory._ A mio parere 'ObjectFactory' deve e deve essere usato _only_ se si deve creare un tipo racchiuso in' JAXBElement <...> ', altrimenti semplicemente inquina il codice. Metodi come 'createXxxType' in' ObjectFactory' chiamano comunque 'new XxxType()'. –

Problemi correlati