2011-10-28 11 views
6

Sınıflarım ve çıktılarımın elimden geldiği kadar basitleştireceğim, ama temelde ne olduğumu bir org.w3c.dom.Element (bu durumda bir atom bağlantısını temsil eden) JAXB'ye eklemek istiyorum nesne dönüyorum. JAXB Sınıf görünüyor gibi bir şey:RESTeasy/JAXB; Bir <any> etiketinde bir Element'e eklenen ad alanından nasıl kaçınılırım? (JAXB'de <Element> Listesi)

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; 
    [...] 
} 

ben böyle oluşturduğunuz bir şablonu kullanarak Eleman kuruyorum: Bu aslında sınıf neye benzediğini, sadece çalışıyorum değil (

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

Tüm dış karışıklık olmadan test etmek için bir şeyi derlemek mümkün olduğunca kolaylaştırmak için).

Sonra kullanarak bu şablonu klonlamak linkTemplate.cloneNode(false);

Şimdi bu tüm bu xml döndüren çalışır, ama tek şey ben dönene xml ek ad bağlı olmasıdır:

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

I Eğer ad kaybolur ve ben alıyorum: "ns3 xmlns": linkTemplate.setAttribute("xmlns", null); eklemek

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

Ama xmlns o çıkarmadan hiçbir yolu var 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: Ben Eleman oluşturmak için kullanmak belgenin ad ile ilgili olmalıdır inanıyorum ama bunu düzeltmek için ne kadar emin değilim. Belgede (XML) targetNamespace'i ayarlama yolu var mı?

Düzenleme 2: Bu herkes için yararlı bir şey ekler, ancak daha fazla deneme ile ben linkTemplate.setAttribute("xmlns:" + anything, null);xmlns:[anything]="" ile bir bağlantı oluşturma ve aksi üretilmiş olan herhangi başkalarını kaldırma etkisi olduğunu bulursa emin değilim.

Düzenleme 3: JAXB nesneleri oluşturmak için kullanılan xsd ilgili bittir:

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

cevap

0

Buradaki önerilerin hiçbiri benim için işe yaramadığından 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

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

+0

Evet, öyle. Ve anladım ki soru yazdıktan sonra ama sonuç maalesef aynı. : \ – Thor84no

+0

Güncellenmiş kodunuzu gönderebilir misiniz? – jtahlborn

+0

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. – Thor84no

0

Sorun DocumentBuilderFactory ad boşluk bilmelidir oluştururken AERE oluşuna bağlıyor.

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 doğrudan xmlns niteliğini manipüle bulursanız , somethibng yanlıştır.

+0

Öneri için teşekkürler, ancak maalesef sonuç tam olarak aynı. – Thor84no

+0

Hmm. Atom öneki neden bir ad alanı bildirimine bağlı değil? Bu belge neye benziyor? –

+0

Ne istediğini tam olarak anladığımdan emin değilim. Hangi belgeyi görmek istiyorsun? – Thor84no

0

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

+0

Öneri için teşekkürler, ancak maalesef işe yaramadı. – Thor84no

İlgili konular