2011-10-28 4 views
6

Ho intenzione di semplificare le mie classi e di produrre il meglio che posso qui, ma in pratica quello che sto cercando è aggiungere un org.w3c.dom.Element (che rappresenta un collegamento atom in questo caso) a un JAXB oggetto sto tornando. La classe JAXB simile a:RESTeasy/JAXB; Come evitare che uno spazio dei nomi venga aggiunto a un elemento in un tag <any>? (Lista <Element> in 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; 
    [...] 
} 

Sto creando l'elemento utilizzando un modello creo così:

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; 
    } 
} 

(Questo non è in realtà ciò che la classe sembra, sto solo cercando per rendere il più semplice possibile compilare qualcosa per testarlo senza tutto il disordine esterno).

Ho poi clonare il modello mediante linkTemplate.cloneNode(false);

Ora tutto questo funziona in quanto restituisce XML, ma la cosa strana è che il codice XML torno ha spazi dei nomi aggiuntivi collegati:

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

Se io aggiungi linkTemplate.setAttribute("xmlns", null); i "xmlns: ns3" namespace scompare e ottengo:

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

Ma sembra che ci sia alcun modo di rimozione che xmlns = "". Sto creando l'elemento nel modo sbagliato? O forse qualcos'altro sta andando storto? Sono piuttosto in perdita sul motivo per cui è l'aggiunta di questi, quindi qualsiasi aiuto/spiegazione sarebbe apprezzato.

Edit: Credo che debba essere correlato al namespace del documento che utilizzo per generare l'elemento, ma non sono sicuro di come risolverlo. C'è un modo per impostare lo spazio targetName (XML) sul documento?

Edit 2: Io non sono sicuro se si aggiunge qualcosa di utile per chiunque, ma con più sperimentando ho scoperto che linkTemplate.setAttribute("xmlns:" + anything, null); ha l'effetto di creare un legame con xmlns:[anything]="" e la rimozione di tutti gli altri che sarebbero altrimenti stati generati.

Edit 3: I bit rilevanti del XSD utilizzati per generare gli oggetti JAXB è:

<?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.] 

risposta

0

Poiché nessuno dei suggerimenti qui ha funzionato per me, ho deciso di seguire una strada diversa. Alla fine ho finito col sovrascrivere il Listener RESTEasy che aggiunge al Marshaller un ascoltatore tutto mio. Questo listener chiama quindi il listener RESTEasy (se presente), prima di aggiungere manualmente i collegamenti nel campo RESTServiceDiscovery (è necessario ottenere questo campo utilizzando reflection e disattivare il controllo dell'accesso con field.setAccessible (true) prima di ottenere l'oggetto) .

0

è il valore di ATOM_LINK = "link"? in tal caso, dovrebbe essere "atom: link" e rimuovere la chiamata setPrefix().

+0

Sì, lo è. E ho capito che dopo aver scritto la domanda, ma il risultato è sfortunatamente lo stesso. : \ – Thor84no

+0

puoi pubblicare il tuo codice aggiornato? – jtahlborn

+0

Eh. È letteralmente quello. ATOM_LINK è ora "atom: link" e setPrefix è sparito. Ho anche provato a creare un elemento radice e rendere questo elemento un figlio di questo, ma non ha fatto nulla, quindi l'ho rimosso di nuovo. – Thor84no

0

Credo che il problema è che la creazione di DocumentBuilderFactory dovrebbe essere basata sullo spazio dei nomi.

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; 
    } 
} 

Se vi trovate a manipolare direttamente attributo xmlns, somethibng è sbagliato.

+0

Grazie per il suggerimento, ma sfortunatamente il risultato è esattamente lo stesso. – Thor84no

+0

Hmm. Perché il prefisso dell'atomo non è associato a una dichiarazione dello spazio dei nomi? Come appare questo documento? –

+0

Non sono sicuro di comprendere appieno cosa stai chiedendo. Che documento vuoi vedere? – Thor84no

0

Avete provato a impostare il parametro elementFormDefault su "Non qualificato"?

+0

Grazie per il suggerimento, ma purtroppo non ha funzionato. – Thor84no

Problemi correlati