2014-09-19 2 views
1
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> 

Почему Маршаллер ведет себя по-другому?

+1

Я считаю, что это не из-за версии JDK, а потому, что разные версии JAXB поставляются вместе с JDK. Версия JDK 1.7 кажется мне правдой, имя корневого элемента должно использоваться как корневой элемент или ссылки на элементы (я думаю). Что происходит, когда вы добавляете аннотацию '@ XmlElementRef' к своей собственности? – lexicore

+0

@lexicore - вы правы, это связано с различными версиями JAXB в комплекте с JDK. Существенным виновником является мой «XmlJavaTypeAdapter». Я создал новый вопрос с подробностями об этом - http://stackoverflow.com/questions/25942081/xmladapter-not-working-correctly-with-newer-version-of-jaxb – coderplus

ответ

1

Вы должны использовать @XmlElementWrapper вместо @XmlElement для вашей карты Недвижимости.

См. http://blog.bdoughan.com/2013/03/jaxb-and-javautilmap.html использование кейс # 2.

+0

Это решило проблему. Я использую xjc для создания аннотированных классов JAXB. Поэтому я создал новый вопрос для реальной проблемы - http://stackoverflow.com/questions/25942081/xmladapter-not-working-correctly-with-newer-version-of-jaxb – coderplus

Смежные вопросы