import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
public class JavaToXMLDemo {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Employee.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Employee object = new Employee();
object.setCode("CA");
object.setName("Cath");
object.setSalary(300);
object.setProperties(new PropertiesMap());
m.marshal(object, System.out);
}
}
@XmlRootElement(name="Employee")
@XmlAccessorType(XmlAccessType.FIELD)
class Employee {
private String code;
@XmlElement(name = "Name")
private String name;
private int salary;
@XmlElement(name = "Properties")
protected PropertiesMap params;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public PropertiesMap getProperties() {
return params;
}
public void setProperties(PropertiesMap value) {
this.params = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int population) {
this.salary = population;
}
}
@XmlRootElement(name="Properties")
class PropertiesMap<K,V> extends HashMap<K,V>
{
}
Приведенный выше код генерирует ниже XML с JDK 1.6JAXB не генерирует XML в соответствии с аннотациями (JDK 1.7)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee>
<code>CA</code>
<Name>Cath</Name>
<salary>300</salary>
<Properties/>
</Employee>
и это на JDK 1.7
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee>
<code>CA</code>
<Name>Cath</Name>
<salary>300</salary>
<params/>
</Employee>
Почему Маршаллер ведет себя по-другому?
Я считаю, что это не из-за версии JDK, а потому, что разные версии JAXB поставляются вместе с JDK. Версия JDK 1.7 кажется мне правдой, имя корневого элемента должно использоваться как корневой элемент или ссылки на элементы (я думаю). Что происходит, когда вы добавляете аннотацию '@ XmlElementRef' к своей собственности? – lexicore
@lexicore - вы правы, это связано с различными версиями JAXB в комплекте с JDK. Существенным виновником является мой «XmlJavaTypeAdapter». Я создал новый вопрос с подробностями об этом - http://stackoverflow.com/questions/25942081/xmladapter-not-working-correctly-with-newer-version-of-jaxb – coderplus