Проблема генерации кода JAXB XJC с типом xs: list date и dateTime - PullRequest
0 голосов
/ 27 июля 2010

Я использую xsd с двумя <xs:list/> элементами.

<xs:element name="packorder1" type="DateTimeTypeXsList"/>
<xs:element name="packorder2" type="DateTypeXsList"/>
<xs:simpleType name="DateTimeTypeXsList">
    <xs:list itemType="xs:dateTime"/>
</xs:simpleType>
<xs:simpleType name="DateTypeXsList">
    <xs:list itemType="xs:date"/>
</xs:simpleType>

Для этих элементов сгенерированный код JAXB:

@XmlList
@XmlElement(required = true)
protected List<XMLGregorianCalendar> packorder1;

@XmlList
@XmlElement(required = true)
protected List<XMLGregorianCalendar> packorder2;

Сгенерированный код не содержит никакой информациио том, какой из этих элементов имеет тип date, а какой имеет тип dateTime. Теперь, если я попытаюсь создать xml, используя jaxbcontext этого класса, он создаст элемент dateTime для packorder1 и packorder2, который он не долженделать.Так как же я могу различить эти два элемента?

Ответы [ 2 ]

1 голос
/ 27 июля 2010

Вы можете добавить аннотацию @XmlSchemaType в вашу модель для управления выводом

        @XmlList 
        @XmlElement(required = true) 
        @XmlSchemaType(name="dateTime")
        protected List<XMLGregorianCalendar> packorder1; 

        @XmlList 
        @XmlElement(required = true) 
        @XmlSchemaType(name="date")
        protected List<XMLGregorianCalendar> packorder2;

Кроме того, XMLGregorianCalendar знает, какой тип схемы XML соответствует данным, которые она содержит, см. Метод getXMLSchemaType в XMLGregorianCalendar:

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#getXMLSchemaType()

Затем JAXB будет использовать этот тип схемы для упорядочивания документа:

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.XmlList;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.datatype.XMLGregorianCalendar;

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Root {

        public Root() {
            packorder1 = new ArrayList<XMLGregorianCalendar>();
            packorder2 = new ArrayList<XMLGregorianCalendar>();
        }


        @XmlList 
        @XmlElement(required = true) 
        protected List<XMLGregorianCalendar> packorder1; 

        @XmlList 
        @XmlElement(required = true) 
        protected List<XMLGregorianCalendar> packorder2;

        public List<XMLGregorianCalendar> getPackorder1() {
            return packorder1;
        }

        public void setPackorder1(List<XMLGregorianCalendar> packorder1) {
            this.packorder1 = packorder1;
        }

        public List<XMLGregorianCalendar> getPackorder2() {
            return packorder2;
        }

        public void setPackorder2(List<XMLGregorianCalendar> packorder2) {
            this.packorder2 = packorder2;
        } 

    }

и

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        DatatypeFactory df = DatatypeFactory.newInstance();

        XMLGregorianCalendar dateTime1 = df.newXMLGregorianCalendar("2010-07-27T12:34:56");
        root.getPackorder1().add(dateTime1);

        XMLGregorianCalendar dateTime2 = df.newXMLGregorianCalendar("2010-03-17T01:02:03");
        root.getPackorder1().add(dateTime2);

        XMLGregorianCalendar date1 = df.newXMLGregorianCalendar("2010-07-27");
        root.getPackorder2().add(date1);

        XMLGregorianCalendar date2 = df.newXMLGregorianCalendar("2010-03-17");
        root.getPackorder2().add(date2);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

даст:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <packorder1>2010-07-27T12:34:56 2010-03-17T01:02:03</packorder1>
    <packorder2>2010-07-27 2010-03-17</packorder2>
</root>
0 голосов
/ 27 июля 2010

Я не уверен, что неправильно вас понимаю, но XJC должен сгенерировать поля типа XmlGregorianCalendar для типов схем dateTime и date.Вам решать, что есть что;ничем не отличается от xs:string и xs:NMTOKEN, оба сопоставляются с java.lang.String.

...