java - 如何在单个类的基础上设置 JAXB 中元素的 elementFormDefault 而不是为整个包设置它?

标签 java xml jaxb schema

我知道我可以使用@XmlSchema 来做到这一点,但问题是我们在同一个包中有一个类需要其命名空间与 package-info.java 上定义的不同。所以我们改为在@XmlRootElement 中声明命名空间(当然同时仍然有@XmlSchema)。但是这样做将不允许我们设置类的 elementFormDefault。将类移动到不同的包不是一种选择。基本上,我只想覆盖这个特定类的命名空间。

最佳答案

长话短说

elementFormDefault=XmlNsForm.QUALIFIED@XmlSchema 上设置时,您可以通过使用 @XmlType(命名空间="ANOTHER_NAMESPACE")。如果您想覆盖根元素的命名空间,您可以执行 @XmlRootElement(namespace="DIFFERENT_NAMESPACE)

了解更多信息


Java 模型

酒吧

您只需要在 @XmlType 注释上为 Bar 类设置命名空间。

package forum14579814;

import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="FOO")
public class Bar {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

包信息

这将覆盖您在包级 @XmlSchema 注释中指定的命名空间。

@XmlSchema(namespace="FOO2", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14579814;

import javax.xml.bind.annotation.*;

这个对象是你领域模型的根。

package forum14579814;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private Bar bar;

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }

}

XML 模式

以下是您通过 http://jsfiddle.net/supertonsky/Phck5/ 提供的 XML 模式.

Foo.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="FOO2"
    xmlns:tns="FOO2" 
    xmlns:tns2="FOO"
    elementFormDefault="qualified">
    <import namespace="FOO" schemaLocation="BAR.xsd"></import>
    <element name="foo" type="tns:Foo"></element>
    <complexType name="Foo">
        <sequence>
            <element name="bar" type="tns2:Bar"></element>
        </sequence>
    </complexType>
</schema>

Bar.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="FOO"
    xmlns:tns="FOO" 
    elementFormDefault="qualified">
    <complexType name="Bar">
        <sequence>
            <element name="name" type="string" maxOccurs="1" nillable="true"></element>
        </sequence>
    </complexType>
</schema>

演示代码

以下演示代码将创建域对象的实例并将其输出到 XML。 XML 输出将在编码操作期间根据您提供的 XML 架构进行验证。

package forum14579814;

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.validation.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Bar bar = new Bar();
        bar.setName("BAR");

        Foo foo = new Foo();
        foo.setBar(bar);

        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(new File("src/forum14579814/Foo.xsd"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setSchema(schema);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

输出

然后您将获得以下输出。请注意,与 Bar 上的 name 属性相对应的 name 元素如何使用 FOO 命名空间进行限定,而所有其他元素使用 FOO2 命名空间进行限定。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:foo xmlns="FOO" xmlns:ns2="FOO2">
    <ns2:bar>
        <name>BAR</name>
    </ns2:bar>
</ns2:foo>

关于java - 如何在单个类的基础上设置 JAXB 中元素的 elementFormDefault 而不是为整个包设置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579814/

相关文章:

Java,解析 xml 属性的原始、未转换值。贾克森或贾克斯布

java - @XmlElementRef 问题 : Invalid XmlElementRef on property {property}, 引用的元素未声明

java - 如何在java中仅删除给定字符串中的字符?

java - Java 和 Spring 中文件支持的持久性选项

java - 我应该从哪里下载什么 jar 文件?

php - 如何从 xml 中隐藏一些 phing 目标

JAXB2-maven 仅在目标中构建

java - 如何返回具有 @Produces(MediaType.APPLICATION_JSON) 的响应字符串?

java - 如何使用 lombok 注释从 jpa 实体注释获取字段值?

java - 基于 Java 服务器的 Web 应用程序中的 HTTP 状态代码