Jaxb - SchemaGen和java.util.Map的命名空间问题

时间:2011-06-07 15:44:19

标签: jaxb jaxb2

当类包含java.util.Map时,SchemaGen会在Map元素上生成带有命名空间的xsd。但是,当marshaller从同一个类生成xml时,没有名称空间是present

这可以通过XmlAdapter解决,但是这似乎需要为每个Map创建3个额外的类。由于我有大量的地图,我不想沿着这条路走下去。

有没有办法让SchemaGen和Marshaller生成相同的xml?

示例类和模式:

测试1:

@XmlRootElement
public class Test1 implements Serializable {

    private String field1;

    private Map<String, Test2> attributes;

    public Test1() {}

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public Map<String, Test2> getAttributes() {
        return attributes;
    }

    public void setAttributes(Map<String, Test2> attributes) {
        this.attributes = attributes;
    }
}

的Test2:

public class Test2 implements Serializable {

    private String name;
    private String value;

    public Test2() {
    }

    public Test2(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

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

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

SchemaGen输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://testns" xmlns:tns="http://testns" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="test1" type="tns:test1"/>

  <xs:complexType name="test1">
    <xs:sequence>
      <xs:element name="attributes">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="key" minOccurs="0" type="xs:string"/>
                  <xs:element name="value" minOccurs="0" type="tns:test2"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="field1" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="test2">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="value" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

符合架构的Xml。 (注意.jaxb不会解组这个xml!)

<?xml version="1.0" encoding="UTF-8"?>
<ns1:test1 
    xmlns:ns1="http://testns" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xsi:schemaLocation="http://testns ../build/schemas/schema1.xsd"
    >
    <ns1:attributes>
        <ns1:entry>
            <ns1:key>a1</ns1:key>
            <ns1:value>
                <ns1:name>a1</ns1:name>
                <ns1:value>v1</ns1:value>
            </ns1:value>
        </ns1:entry>
    </ns1:attributes>
    <ns1:field1>f1</ns1:field1>
</ns1:test1>

Jaxb生成的Xml。 (注意。它不符合架构!)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:test1 xmlns:ns2="http://testns">
    <ns2:attributes>
        <entry>
            <key>a1</key>
            <value>
                <ns2:name>a1</ns2:name>
                <ns2:value>v1</ns2:value>
            </value>
        </entry>
    </ns2:attributes>
    <ns2:field1>f1</ns2:field1>
</ns2:test1>

0 个答案:

没有答案