2011-10-28 5 views
6

Voy a simplificar mis clases y salida lo mejor que puedo aquí, pero básicamente lo que busco es que quiero agregar un org.w3c.dom.Element (que representa un enlace atómico en este caso) a un JAXB Objeto, estoy volviendo. La clase JAXB se ve algo como:RESTeasy/JAXB; ¿Cómo evito que se agregue un espacio de nombre a un Elemento en una etiqueta <any>? (Lista <Element> en JAXB)

import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 
import org.w3c.dom.Element; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "People", namespace = "main", propOrder = { 
    "any", 
    "persons" 
}) 
public class People { 
    @XmlAnyElement 
    protected List<Element> any; 
    @XmlElement(name = "person", namespace = "main") 
    protected List<Person> persons; 
    [...] 
} 

estoy creando el elemento utilizando una plantilla se crea de esta manera:

import javax.xml.XMLConstants; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import org.w3c.dom.DOMException; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.xml.sax.SAXException; 

public class ElementGen { 
    public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException { 
     final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     final Schema schema = sf.newSchema(new StreamSource(
       Thread.currentThread().getContextClassLoader().getResourceAsStream(ATOM_XSD))); 
     final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance(); 
     docBuilder.setSchema(schema); 
     final Document doc = docBuilder.newDocumentBuilder().newDocument(); 
     linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK); 
     return linkTemplate; 
    } 
} 

(Eso no es realmente lo que la clase se parece, sólo estoy tratando para que sea tan fácil como sea posible compilar algo para probarlo sin todo el lío externo).

entonces clonar esa plantilla usando linkTemplate.cloneNode(false);

Ahora todo esto funciona en el que devuelve XML, pero lo más curioso es que el xml que regrese tiene espacios de nombres adicionales unidos:

<atom:link xmlns:ns3="main" xmlns="" href="href" rel="rel"/> 

Si yo añadir linkTemplate.setAttribute("xmlns", null); los "xmlns: NS3" espacio de nombres desaparece y me sale:

<atom:link xmlns="" href="href" rel="rel"/> 

Pero parece que no hay manera de eliminar que xmlns = "". ¿Estoy creando el Elemento de la manera incorrecta? ¿O tal vez algo más está yendo mal? No entiendo por qué se está agregando esto, así que cualquier ayuda/explicación sería apreciada.

Editar: Creo que debe estar relacionado con el espacio de nombre del documento que uso para generar el Elemento, pero no estoy seguro de cómo solucionarlo. ¿Hay alguna forma de establecer el targetNamespace (XML) en el documento?

Edit 2: No estoy seguro si agrega algo útil para cualquier persona, pero con más experimentación encontré que linkTemplate.setAttribute("xmlns:" + anything, null); tiene el efecto de crear un enlace con xmlns:[anything]="" y eliminar cualquier otro que de otro modo se hubiera generado.

Editar 3: Los bits correspondientes de la xsd utilizados para generar los objetos JAXB es:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema version="1.0" 
    xmlns="main" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    targetNamespace="main" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

<xs:complexType name="People"> 
    <xs:sequence> 
     <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="person" type="Person" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    [attributes] 
</xs:complexType> 
[other types etc.] 

Respuesta

0

Dado que ninguna de las sugerencias aquí me ha funcionado, he decidido tomar una ruta diferente. Al final, terminé sobrescribiendo al Oyente. RESTEasy agrega al Marshaller con un Oyente mío. Este oyente luego llama al oyente RESTEasy (si estaba presente), antes de agregar los enlaces manualmente en el campo RESTServiceDiscovery (tiene que obtener este campo usando la reflexión, y desactivar la comprobación de acceso con field.setAccessible (true) antes de obtener el objeto) .

0

es el valor de ATOM_LINK "link" =? si es así, debería ser "átomo: enlace", y eliminar la llamada setPrefix().

+0

Sí, lo es. Y me di cuenta de que después de escribir la pregunta, pero el resultado desafortunadamente es el mismo. : \ – Thor84no

+0

puede publicar su código actualizado? – jtahlborn

+0

Eh. Es solo literalmente eso. ATOM_LINK ahora es "átomo: enlace" y setPrefix se ha ido. También traté de crear un elemento raíz y hacer que este elemento fuera un elemento secundario de eso, pero no hizo nada, así que lo eliminé nuevamente. – Thor84no

0

Creo que el problema es que el DocumentBuilderFactory que está creando debe tener en cuenta el espacio.

public class ElementGen { 
    public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException { 
    final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance(); 
    docBuilder.setNamespaceware(true); 
    final Document doc = docBuilder.newDocumentBuilder().newDocument(); 
    linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK); 
    return linkTemplate; 
    } 
} 

Si usted se encuentra manipulando xmlns atributo directamente, somethibng está mal.

+0

Gracias por la sugerencia, pero desafortunadamente el resultado es exactamente el mismo. – Thor84no

+0

Hmm. ¿Por qué el prefijo atómico no está vinculado a una declaración de espacio de nombres? ¿Cómo se ve este documento? –

+0

No estoy seguro de entender completamente lo que preguntas. ¿Qué documento quieres ver? – Thor84no

0

¿Ha intentado configurar su elementFormDefault como "No calificado"?

+0

Gracias por la sugerencia, pero desafortunadamente no funcionó. – Thor84no

Cuestiones relacionadas