RESTeasy/JAXB; Agar bironta tegda Elementga qo'shiladigan nom maydonidan qanday qochishim mumkin? (JAXB da <element> ro'yxati)

Men darslarimni va chiqishni soddalashtirmoqchi bo'laman, lekin asosan men nima qilgan bo'lsam, org.w3c.dom.Element ni qo'shishni istayman (bu JAXB ob'ektiga qaytib kelaman. JAXB klassi quyidagi kabi ko'rinadi:

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

Men yaratgan shablon yordamida Elementni yarataman:

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

(Menimcha, bu sinfning asl ko'rinishi emas, men uni tashqi xatoliklarsiz tekshirib ko'rish uchun biror narsani to'plashni iloji boricha osonroq qilishga harakat qilaman).

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

Endi bu barcha ishlarni qaytaradi xml, lekin g'alati narsa, men qaytarib olish xml menda qo'shimcha nomlar mavjud:


Agar linkTemplate.setAttribute ("xmlns", null) qo'shsam, "xmlns: ns3" nom maydoni yo'qoladi va men quyidagilarni olaman:


Lekin xmlns = "" ni olib tashlashning iloji yo'q ko'rinadi. Elementni noto'g'ri shaklda yaratyapmanmi? Yoki boshqa biror narsa noto'g'ri ketmoqda? Men hech qanday yordam yoki tushuntirishni maqbul deb hisoblayman, shuning uchun bularning barchasi qo'shilayapti.

Tartibga solish: Men elementni ishlab chiqarish uchun foydalanadigan hujjatning nom maydoni bilan bog'liq bo'lishi kerak, deb o'ylayman, lekin uni qanday tuzatish kerakligiga ishonchim komil emas. Hujjatda (XML) targetNamespaceni belgilashning biron bir usuli mavjudmi?

Tartibga solish 2: Men hech kimga foydali bo'lgan narsa emasligini bilmayman, lekin ko'proq tajriba bilan linkTemplate.setAttribute ("xmlns:" + anything, null); xmlns: [anything] = "" bilan bog'lanish va boshqacha qilib yaratilgan boshqa barcha narsalarni olib tashlash.

Tartibga solish 3: JAXB moslamalarini yaratish uchun ishlatiladigan xsd ning tegishli bitlari:

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



    
        
        
    
    [attributes]

[other types etc.]
6

4 javoblar

ATOM_LINK = "havola" ning qiymati nima? agar shunday bo'lsa, u "atom: bog'lanish" bo'lishi kerak va setPrefix() chaqiruvini olib tashlash kerak.

0
qo'shib qo'ydi
yangilangan kodingizni joylashtirasizmi?
qo'shib qo'ydi muallif jtahlborn, manba
atributlarni qanday qo'shyapsiz?
qo'shib qo'ydi muallif jtahlborn, manba
Yo'q, boshqa xususiyatlarni nazarda tutyapmanmi (href, rel)?
qo'shib qo'ydi muallif jtahlborn, manba
Ha shunaqa. Va men savolni yozgandan keyin, men natijada afsuski bir xil narsa ekanligini angladim. : \
qo'shib qo'ydi muallif Thor84no, manba
Eh. Buning ma'nosi shunchaki. ATOM_LINK endi "atom: bog'lanish" va setPrefix yo'q. Men ham ildiz unsurini yaratishga harakat qildim va bu elementni bolaligiga aylantirishga harakat qildim, lekin hech narsa qilmadim, shuning uchun uni qayta olib tashladim.
qo'shib qo'ydi muallif Thor84no, manba
linkTemplate.setAttribute ("xmlns", null); va hokazo. Shablonni klonlashgandan keyin.
qo'shib qo'ydi muallif Thor84no, manba
Yana bir xil, faqat "xmlns" ni "href"/"rel" bilan almashtiring va savolda xmldan Strringlar bilan null.
qo'shib qo'ydi muallif Thor84no, manba

Muammo shundaki, siz yaratgan DocumentBuilderFactory nomi bo'sh joy bo'lishi kerak.

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

Agar siz o'zingiz to'g'ridan-to'g'ri xmlns xususiyati bilan ishlov berishni topsangiz, ba'zi bir noto'g'ri.

0
qo'shib qo'ydi
Hmm. Nima uchun atom prefiksi nom maydoni deklaratsiyasiga bog'liq emas? Ushbu hujjat nimaga o'xshash?
qo'shib qo'ydi muallif forty-two, manba
Aloqa elementini yaratishda foydalanadigan hujjat (Edit1: savolingizda)
qo'shib qo'ydi muallif forty-two, manba
Taklif uchun tashakkur, lekin afsuski, natijalar bir xil.
qo'shib qo'ydi muallif Thor84no, manba
Sizning so'raganingizni to'liq tushunganimga amin emasman. Siz qanday hujjatni ko'rishni xohlaysiz?
qo'shib qo'ydi muallif Thor84no, manba
Ok. Men bu savolning keskin versiyasini qo'shdim.
qo'shib qo'ydi muallif Thor84no, manba

Bu erda takliflarning hech biri men uchun ishlamagani uchun boshqa yo'lga o'tishga qaror qildim. Natijada men tinglovchilarni qayta yozishni yakunladim. RESTEasy Marshalerga o'zining tinglovchisi bilan qo'shildi. Ushbu tinglovchi keyinchalik RESTServiceDiscovery maydonida ulanishlarni qo'lda qo'shishdan oldin RESTEasy tinglovchini (agar u mavjud bo'lsa) chaqiradi (ob'ektni olishdan oldin bu maydonni aks ettirishingiz kerak va field.setAccessible (rost) bilan kirishni tekshirishni o'chirib qo'yishingiz kerak) .

0
qo'shib qo'ydi

ElementFormDefault "Unqualified" ga sozlashni sinab ko'rdingizmi?

0
qo'shib qo'ydi
Taklif uchun tashakkur, lekin afsuski, u ishlamadi.
qo'shib qo'ydi muallif Thor84no, manba