2011-12-15 21 views
5

estoy tratando de reunir un archivo utilizando el Visio XML Schema, que consta de 3 archivos de esquema y produce tres paquetes cuando se genera fuente de Java con XJC:¿JAXB está confundido acerca de los elementos raíz?

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

El elemento raíz es VisioDocument, y todas las clases estoy usando están en el 2003 paquete.

Aquí es mi enfoque que permita reunir mi archivo 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); 

Cuando se ejecuta, recibo este error:

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] 

estoy usando PagePropsType, pero no es un elemento raíz. ¿Por qué JAXB piensa que es?

+0

¿Cómo es la propiedad que está configurando la instancia de 'com.microsoft.schemas.visio._2003.core.PagePropsType' en anotado ? –

+0

'@XmlAccessorType (XmlAccessType.CAMPO) @XmlType (name = "PageProps_Type", propOrder = { "pageWidthOrPageHeightOrShdwOffsetX" }) '¿Es eso lo que está buscando? – Chris

+0

Quise decir la propiedad en la que está configurando la instancia y no el 'PagePropsType' en sí. –

Respuesta

2

El problema reside en la parte ... manipulated here ... de su código.

Según el supuesto de que hace lo siguiente (o algo similar).

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

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

(ShapeSheetType es una superclase para StyleSheetType, etcétera.)

Si este es el caso, entonces su problema radica en la adición de la pageProps a la lista directamente.

Si echa un vistazo a la documentación del método getTextOrXFormOrLine(), enumera qué tipo de tipos puede contener la lista. Cada tipo está envuelto en un JAXBElement<...> por lo que debe ajustar pageProps antes de agregarlo a la lista.

Debe hacerlo de esta manera:

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

(Tenga en cuenta que he utilizado XJC 2.2.4 para compilar los esquemas, para mí cada nombre de la clase tiene el sufijo Type Tal vez por eso. terminé con VisioDocumentType en lugar de VisioDocument como tú, pero no debería importar.)

+0

Esto parece ser lo que me faltaba, gracias. (la falta de 'Tipo' era un error tipográfico) – Chris

1

Si comprueba el código generado, encontrará una clase ObjectFactory allí. Esta clase debe tener un método que devuelva un VisioDocument envuelto en un JAXBElement, y que sea el objeto que desea pasar al contador de referencias.

Igual aplicable a todos los objetos que establezca dentro de VisioDocument - no los cree con 'new', pero use ObjectFactory.

+0

Lo hice pero el problema persiste. – Chris

+0

_Same aplicable a todos los objetos que establezca dentro de VisioDocument - no los cree con 'nuevo' pero use ObjectFactory._ En mi opinión 'ObjectFactory' debe y debe ser usado _only_ si tiene que crear un tipo envuelto en' JAXBElement <...> ', de lo contrario, solo contamina el código. Los métodos como 'createXxxType' en' ObjectFactory' solo llaman 'new XxxType()' de todos modos. –

Cuestiones relacionadas