RestEasy的/ JAXB; 如何避免将命名空间添加到<any>标记中的元素?(在JAXB中列出<Element>)

Tho*_*4no 6 java xml jaxb resteasy

我将尽可能地简化我的类和输出,但基本上我想要的是我想org.w3c.dom.Element在我返回的JAXB对象中添加一个(在这种情况下表示一个原子链接).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;
    [...]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用我创建的模板创建元素:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(这实际上并不是这个类看起来像什么,我只是想尽可能简单地编译一些东西来测试它而没有所有的外部混乱).

然后我使用克隆该模板 linkTemplate.cloneNode(false);

现在这一切都在于它返回xml,但奇怪的是我得到的xml附加了额外的命名空间:

<atom:link xmlns:ns3="main" xmlns="" href="href" rel="rel"/>
Run Code Online (Sandbox Code Playgroud)

如果我添加linkTemplate.setAttribute("xmlns", null);"xmlns:ns3"命名空间消失,我得到:

<atom:link xmlns="" href="href" rel="rel"/>
Run Code Online (Sandbox Code Playgroud)

但似乎无法删除xmlns ="".我是以错误的方式创建元素吗?或者其他可能出错的地方?我完全不知道为什么它会添加这些,所以任何帮助/解释都会受到赞赏.

编辑:我认为它必须与我用于生成Element的文档的命名空间相关,但我不确定如何修复它.有没有办法在文档上设置(XML)targetNamespace?

编辑2:我不确定它是否添加了对任何人有用的东西,但通过更多的实验,我发现它linkTemplate.setAttribute("xmlns:" + anything, null);具有创建链接xmlns:[anything]=""和删除任何其他本来会生成的链接的效果.

编辑3:用于生成JAXB对象的xsd的相关位是:

<?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.]
Run Code Online (Sandbox Code Playgroud)

Tho*_*4no 0

由于这里的建议都不适合我,所以我决定走另一条路。最后,我最终用我自己的监听器覆盖了 RESTEasy 添加到 Marshaller 的监听器。然后,此侦听器调用 RESTEasy 侦听器(如果存在),然后在 RESTServiceDiscovery 字段上手动添加链接(您必须使用反射获取此字段,并在获取对象之前使用 field.setAccessible(true) 关闭访问检查) 。