2

xs:dateTime 필드가있는 xsd가 있습니다. 이것은 사내 내부 API이며, ISO-8601과 호환되도록 항상 오프셋 데이터가 포함되도록 보장 할 수 있습니다.jaxb 플러그인 사용 방법 OffsetDateTime

2016-01-01T00 : 00 : 00 : 예를 들어 00.000 + 01 :

00 현재 JAXB2 플러그인 타입 XMLGregorianCalendar의 필드에 xs:dateTime 매핑합니다. 대신 플러그인을 구성하여 OffsetDateTime을 사용 하시겠습니까?

해결 방법이 maven-jaxb2-plugin, jaxb2-maven-plugin 또는 cxf-codegen-plugin인지 여부는 상관 없습니다. 문제가 해결 될 때까지 사용하겠습니다.

답변

0

파일과 함께 jaxb2-maven-plugin을 사용할 수 있습니다.

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> 
    <jaxb:bindings schemaLocation="odt.xsd"> 
     <jaxb:bindings node="//xsd:element[@name='date']"> 
      <jaxb:javaType name="java.time.OffsetDateTime" 
      parseMethod="xsd.test.OffsetDateTimeAdapter.parse" 
      printMethod="xsd.test.OffsetDateTimeAdapter.print" /> 
     </jaxb:bindings> 
     <jaxb:schemaBindings> 
      <jaxb:package name="xsd.test" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 
: 나는에서 그것에 변환 date 필드의 유형을 정의하는 jaxb-bindings.xjb 파일, 또한 클래스를 만든 다음

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="teste" type="Teste" /> 
    <xsd:complexType name="Teste"> 
    <xsd:sequence> 
     <xsd:element name="date" type="xsd:dateTime" minOccurs="1" 
     maxOccurs="1" nillable="false"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

:

은 우선은 odt.xsd 파일을 만든

이 파일은 OffsetDateTime에서 String으로 변환하는 xsd.test.OffsetDateTimeAdapter 클래스와 각각의 메서드를 참조하므로 작성했습니다 :

package xsd.test; 

import java.time.OffsetDateTime; 

public class OffsetDateTimeAdapter { 

    public static OffsetDateTime parse(String value) { 
     return OffsetDateTime.parse(value); 
    } 

    public static String print(OffsetDateTime value) { 
     return value.toString(); 
    } 
} 

다음, pom.xml에서 나는 플러그인에 대한 구성을 추가 한 :이

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>jaxb2-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>xjc</id> 
      <goals> 
       <goal>xjc</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <!-- The package of your generated sources --> 
     <packageName>xsd.test</packageName> 
     <sources> 
      <source>src/main/resources/odt.xsd</source> 
     </sources> 
     <xjbSources> 
      <xjbSource>src/main/resources/jaxb-bindings.xjb</xjbSource> 
     </xjbSources> 
    </configuration> 
</plugin> 

을, 난 그냥 mvn clean package와 함께 프로젝트를 구축했습니다과 만든 항아리는 xsd.test에서 생성 된 파일이 포함되어 있습니다 꾸러미. 이에

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

    @XmlElement(required = true, type = String.class) 
    @XmlJavaTypeAdapter(Adapter1 .class) 
    @XmlSchemaType(name = "dateTime") 
    protected OffsetDateTime date; 
    // getter and setter 
} 

상기 date 필드 (내부 위에서 만든 xsd.test.OffsetDateTimeAdapter 클래스를 사용하는) 자동 생성 Adapter1 사용하여 OffsetDateTime에 매핑되는 다음 Teste 클래스는 OffsetDateTimedate 필드를 포함한다. xml 형식에서 날짜를 파싱 예 :

ObjectFactory f = new ObjectFactory(); 
JAXBContext context = JAXBContext.newInstance("xsd.test"); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns2:teste xmlns:ns2=\"xsd.test\"><date>2016-01-01T00:00+01:00</date></ns2:teste>"; 
JAXBElement<Teste> jaxElement = unmarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(xml.getBytes())), Teste.class); 
OffsetDateTime odt = jaxElement.getValue().getDate(); 
System.out.println(odt); // 2016-01-01T00:00+01:00 

그리고 XML로 날 마샬링하면 OffsetDateTime는 직접 String 같은 2016-01-01T00:00+01:00 등으로 변환된다. xsd.test 패키지에

xjc src/main/resources/odt.xsd -d src/main/java/ -p xsd.test -b src/main/resources/jaxb-bindings.xjb 

이, src/main/java 디렉토리의 클래스를 생성합니다


또 다른 방법은 JDK와 함께 제공되는 명령 줄 xjc을 사용하는 것입니다.

+1

고맙습니다. 단점은 단지'xjb :'의 모든'xsd : dateTime' 요소를 열거해야한다는 것입니다. 그러나 그것은 사소한 부분입니다. –

+0

@LustigerAstronaut 도와 주셔서 감사합니다.어쩌면 당신은 바인딩을'node = "// xsd : element [@ type = 'xsd : dateTime']"'(필자는 테스트하지 않았다) –