Преобразовать тип даты в строку в jaxb, используя привязки

Я получаю сообщение об ошибке:

Не удалось преобразовать xsd: date в тип java.lang.String

Я использую файл binding.xml с плагином CXF XJC

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Date" type="xsd:date"/>
    <xsd:element name="Audit">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Creation">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element ref="Date"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

binding.xml

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <jaxb:bindings>
        <jaxb:globalBindings>
            <jaxb:javaType name="java.lang.String" xmlType="xsd:date"/>
        </jaxb:globalBindings>
    </jaxb:bindings>
</jaxb:bindings> 

CXF XJC плагин:

    <plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-xjc-plugin</artifactId>
        <version>3.0.3</version>
        <executions>
            <execution>
                <id>generate-resources</id>
                <phase>generate-resources</phase>
                <configuration>
                    <defaultOptions>
                        <bindingFiles>
                            <bindingFile>${basedir}/src/main/resources/META-INF/binding.xml</bindingFile>
                        </bindingFiles>
                        <noAddressBinding>true</noAddressBinding>
                    </defaultOptions>
                    <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                    <xsdOptions>
                        <xsdOption>
                            <xsd>${basedir}/src/main/resources/xsd/Misc.xsd</xsd>
                            <packagename>com.mycomp.ext.schema</packagename>
                            <extension>true</extension>
                        </xsdOption>
                    </xsdOptions>
                </configuration>
                <goals>
                    <goal>xsdtojava</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Сгенерированный код содержит XMLGregorianCalendar вместо String

    @XmlElement(name = "Date", required = true)
    @XmlSchemaType(name = "date")
    protected XMLGregorianCalendar date;

Любые предложения, пожалуйста?

2 ответа

Если вы измените тип xml на xsd:date xsd:string, он должен работать

Извините, я имею в виду, если вам нужно получить доступ к нему как к строковому полю в Java, вы должны определить эту схему с типом xsd:string вместо типа xsd:date.

Вариант первый: если вы хотите использовать поле в качестве даты в Java, вы можете отформатировать его в Java позже.
Вариант 2: Если вы хотите, чтобы схема заботилась о типе данных, вы должны определить ее как xsd:date и использовать XMLGregorianCalendar, который можно преобразовать в календарь или в обычный объект Java даты позже в Java. Таким образом, проверка формата даты будет выполняться самой схемой.

Другие вопросы по тегам