2013-11-11 2 views
6

Это мой XSD-файлНе генерирует @XMLRootElement JAXB

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="Person" type="PersonType"/> 
    <xs:complexType name="PersonType"> 

     <xs:sequence> 
      <xs:element name="Name" type="xs:string"/> 
      <xs:element name="Address" type="AddressType" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="AddressType"> 

     <xs:sequence> 
      <xs:element name="Number" type="xs:unsignedInt"/> 
      <xs:element name="Street" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 

используя этот XSD-файл Я сгенерированного этот класс:

package demo5; 

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "PersonType", propOrder = { 
    "name", 
    "address" 
}) 
public class PersonType { 

@XmlElement(name = "Name", required = true) 
protected String name; 
@XmlElement(name = "Address", required = true) 
protected List<AddressType> address; 

public String getName() { 
    return name; 
} 

public void setName(String value) { 
    this.name = value; 
} 
public List<AddressType> getAddress() { 
    if (address == null) { 
     address = new ArrayList<AddressType>(); 
    } 
    return this.address; 
} 

} 

но файл XSD не генерирует @ XMLRootElement в java-файле. любой может дать для этого решение. Я знаю, может генерировать корневой элемент, но это не работает.

ответ

1

@XMLRootElement будет создан только для анонимных типов элементов верхнего уровня, а не для типов верхнего уровня.

+1

@XMLRootElement генерируется ТОЛЬКО для типов верхнего уровня. –

+1

@JeffWalker no, '@ XMLRootElement' будет генерироваться только для анонимных типов (из верхних элементов) – Puce

6

Для глобальных элементов, соответствующих указанным комплексным типам, вместо аннотация для класса будет генерироваться аннотация объекта @XmlElementDecl на классе ObjectFactory. Это связано с тем, что может быть более одного глобального элемента, соответствующего одному и тому же сложному типу. Этот прецедент не может быть выполнен с использованием @XmlRootElement.

@XmlRegistry 
public class ObjectFactory { 

    @XmlElementDecl(name="Person") 
    public JAXBElement<PersonType> createPerson(PersonType personType) { 
     return new JAXBElement<PersonType>(new QName("Person"), PersonType.class, personType); 
    } 

} 

Создание JAXBContext

При создании JAXBContext на основе модели сгенерированного из схемы XML должно быть сделано на имя пакета сгенерированной модели. Таким образом, обрабатываются метаданные класса ObjectFactory.

JAXBContext jc = JAXBContext.newInstance("demo5"); 

Или сгенерированный ObjectFactory класс:

JAXBContext jc = JAXBContext.newInstance(demo5.ObjectFactory.class); 

немаршалинг Классом

Когда вы распаковать класс, в котором корневой элемент соответствует @XmlElementDecl аннотацию вы получите экземпляр JAXBElement задний.

JAXBElement<PersonType> je = (JAXBElement<PersonType>) unmarshaller.unmarshal(xml); 
PersonType pt = je.getValue(); 

Если вы хотите, чтобы защитить против JAXBElement возвращается вы всегда можете использовать JAXBIntrospector на результат распаковать операции:

PersonType pt = (PersonType) JAXBIntrospector.getValue(unmarshaller.unmarshal(xml)); 

Для получения более подробной информации

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