RESTeasy/JAXB; Bir <insert> etiketinde bir Elemana eklenmiş bir ad alanından nasıl kaçınılırım? (JAXB'de <Eleman> Listesi)

Derslerimi ve çıktılarımın elimden geldiği kadar basitleştireceğim ama temel olarak şu an bir org.w3c.dom.Element eklemek istiyorum. durumda) bir JAXB nesnesine dönüyorum. JAXB Sınıfı şöyle bir şey:

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 any;
    @XmlElement(name = "person", namespace = "main")
    protected List persons;
    [...]
}

Bu şekilde oluşturduğum bir şablonu kullanarak Öğeyi oluşturuyorum:

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

(Bu aslında sınıfın neye benzediğiyle ilgili değil, sadece bir şeyleri dışsal karışıklık olmadan test etmek için derlemeyi mümkün olduğunca kolaylaştırmaya çalışıyorum).

I then clone that template using linkTemplate.cloneNode(false);

Şimdi tüm bu xml döndürür, ancak garip bir şey geri döndüğüm xml ek ad alanları ekli olduğu çalışır:


linkTemplate.setAttribute ("xmlns", null) eklerseniz; "xmlns: ns3" ad alanı kaybolur ve ben alırım:


Ancak, xmlns = "" i kaldırmanın bir yolu yok gibi görünüyor. Öğeyi yanlış şekilde mi yaratıyorum? Ya da belki başka bir şey yanlış gidiyor? Bunları niçin eklediğine dair bir kayıp yapıyorum, böylece herhangi bir yardım/açıklama takdir edilecektir.

Düzenleme: Öğeyi oluşturmak için kullandığım belgenin ad alanıyla ilişkili olması gerektiğine inanıyorum, ancak nasıl düzelteceğimi bilmiyorum. Belgede (XML) targetNamespace'i ayarlama yolu var mı?

Düzenleme 2: Herkes için yararlı bir şey eklediğinden emin değilim, ancak daha fazla deneyle linkTemplate.setAttribute ("xmlns:" + bir şey, null) bulduğumdan emin değilim. , xmlns: [bir şey] = "" ile bağlantı kurabilir ve aksi halde oluşturulacak olanları kaldırabilirsiniz.

Düzenleme 3: JAXB nesnelerini oluşturmak için kullanılan xsd'nin ilgili bitleri:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>



    
        
        
    
    [attributes]

[other types etc.]
6

4 cevap

ATOM_LINK = "link" değeri nedir? öyleyse, "atom: link" olmalı ve setPrefix() çağrısını kaldırın.

0
katma
güncellenmiş kodunuzu gönderebilir misiniz?
katma yazar jtahlborn, kaynak
özellikleri nasıl ekliyorsunuz?
katma yazar jtahlborn, kaynak
hayır, diğer nitelikleri (href, rel) kastediyorum?
katma yazar jtahlborn, kaynak
Evet öyle. Ve anladım ki soru yazdıktan sonra ama sonuç maalesef aynı. : \
katma yazar Thor84no, kaynak
Eh. Sadece tam anlamıyla bu. ATOM_LINK şimdi "atom: link" ve setPrefix gitti. Ayrıca bir kök eleman yaratmayı ve bu öğeyi bunun bir çocuk yapmasını da denedim, ama bir şey yapmadı, bu yüzden tekrar kaldırdım.
katma yazar Thor84no, kaynak
linkTemplate.setAttribute ("xmlns", null); vb. Şablonu klonladıktan hemen sonra.
katma yazar Thor84no, kaynak
Yine tam olarak aynı, sadece "hml"/"rel" ile "xmlns" değiştirin ve sorudaki xml dizeleriyle null.
katma yazar Thor84no, kaynak

Problemin, yarattığınız DocumentBuilderFactory ad alanının farkında olması gerektiğine inanıyorum.

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

Kendinizi xmlns özniteliğini doğrudan manipüle ediyorsanız, bir şey yanlıştır.

0
katma
Hmm. Atom öneki neden bir ad alanı bildirimine bağlı değil? Bu belge neye benziyor?
katma yazar forty-two, kaynak
Bağlantı öğesini oluşturmak için kullandığınız belge (Sorunuzdaki Edit1:)
katma yazar forty-two, kaynak
Öneri için teşekkürler, ama maalesef sonuç tam olarak aynı.
katma yazar Thor84no, kaynak
Ne istediğini tam olarak anladığımdan emin değilim. Hangi belgeyi görmek istiyorsun?
katma yazar Thor84no, kaynak
Tamam. Sorunun bir aşağı-aşağı sürümünü ekledim.
katma yazar Thor84no, kaynak

Buradaki önerilerin hiçbiri benim için çalışmadığı için farklı bir rotaya gitmeye karar verdim. Sonunda Dinleyici RESTEasy'nin üzerine yazarak, Marshaller'a kendi dinleyicim ile ekledim. Bu Dinleyici, daha sonra RESTServiceDiscovery alanına bağlantıları eklemeden önce RESTEasy dinleyicisini (eğer mevcutsa) çağırır (yansımayı kullanarak bu alanı almanız ve nesneye ulaşmadan önce field.setAccessible (true) ile erişim denetimini kapatmanız gerekir) .

0
katma

ElementFormDefault öğesini "UNqualified" olarak ayarlamayı denediniz mi?

0
katma
Öneri için teşekkürler, ama maalesef işe yaramadı.
katma yazar Thor84no, kaynak