当类包含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>