2014-10-28 2 views
2

나는 github에서 테스트 유닛을 설치했다. 누군가 XML이 비 정렬 화 된 것처럼 보이지만 왜 작동하지 않는지 확인할 수 있습니까?JAXB2 유형 제한이 작동하지 않습니까?

https://github.com/jjYBdx4IL/misc-tests/blob/master/src/test/java/jjybdx4il/jaxb/bugs/Stackoverflow26618647Test.java

"<?xml version=\"1.0\" encoding=\"UTF-8\"?><message:GenericData xmlns:message=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message\" xmlns:common=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:generic=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic\" xsi:schemaLocation=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message https://sdw-wsrest.ecb.europa.eu/vocabulary/sdmx/2_1/SDMXMessage.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common https://sdw-wsrest.ecb.europa.eu/vocabulary/sdmx/2_1/SDMXCommon.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic https://sdw-wsrest.ecb.europa.eu/vocabulary/sdmx/2_1/SDMXDataGeneric.xsd\">\n" 
      + "<message:Header>\n" ... 

GenericDataType 올바르게 인스턴스화됩니다 가장 외부 요소입니다. 디버거를 사용하고 손으로 제작 한 공용 생성자에 중단 점을 설정했는지 확인했습니다. 그러나 Header 요소는 Abstract 인 BaseHeaderType 클래스의 인스턴스화로 연결됩니다.

<xs:complexType name="GenericDataType"> 
    <xs:annotation> 
     <xs:documentation>GenericDataType defines the contents of a generic data message.</xs:documentation> 
    </xs:annotation> 
    <xs:complexContent> 
     <xs:restriction base="MessageType"> 
      <xs:sequence> 
       <xs:element name="Header" type="GenericDataHeaderType"/> 
       <xs:element name="DataSet" type="data:DataSetType" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="footer:Footer" minOccurs="0"/> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

왜 코드 생성시 그 무시 XJC 않습니다 다음 GenericDataType의 헤더가 GenericDataHeaderType로 제한된다

는 SDMXMessage.xsd에서 명확하게이 적혀있다?

public abstract class MessageType { 

@XmlElement(name = "Header", required = true) 
protected BaseHeaderType header; 
@XmlAnyElement(lax = true) 
protected List<Object> any; 
@XmlElement(name = "Footer", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer") 
protected FooterType footer; 

public class GenericDataType 
    extends MessageType { 
} 

내가 할 수있는 조치가 있습니까? 실제로 작동하는 XSD 파일에서 Java 도메인 모델을 작성하는 자동 대안?

+0

로그에 뭔가가 있습니까? 일반적으로 잘못된 점에 대한 힌트를 얻어야합니다. 'any'는 일반적으로 XJC에서 스키마 구조가 너무 이상 할 때 나타나는 catch-all-property입니다. 귀하의 경우 이름 충돌이있을 수 있습니다. 'header' 나'footer' 엘리먼트 등이 있으면'MessageType'을 확인하고 커스터마이즈를 시도하십시오. – lexicore

+0

xjc가 형식 제한을 처리하지 않는 것과 관련이 있다고 생각합니다. – user1050755

+0

스키마를 보지 않고 말하기가 어렵습니다. – lexicore

답변

1

좋아, 답변으로 게시하겠습니다.

당신 때문에 구조의 유형이 문제로 실행 :

<xs:complexType name="MessageType" abstract="true"> 
    <xs:annotation> 
     <xs:documentation>MessageType is an abstract type which is used by all of the messages, to allow inheritance of common features. Every message consists of a mandatory header, followed by optional payload (which may occur multiple times), and finally an optional footer section for conveying error, warning, and informational messages.</xs:documentation> 
    </xs:annotation> 
    <xs:sequence> 
     <xs:element name="Header" type="BaseHeaderType"/> 
     <xs:any namespace="##targetNamespace" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element ref="footer:Footer" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

...

<xs:complexType name="GenericDataType"> 
    <xs:annotation> 
     <xs:documentation>GenericDataType defines the contents of a generic data message.</xs:documentation> 
    </xs:annotation> 
    <xs:complexContent> 
     <xs:restriction base="MessageType"> 
      <xs:sequence> 
       <xs:element name="Header" type="GenericDataHeaderType"/> 
       <xs:element name="DataSet" type="data:DataSetType" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element ref="footer:Footer" minOccurs="0"/> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

하나의 요소는 더 구체적인 요소/유형 (DataSet)로 제한됩니다. 모든 속성은 이미 슈퍼 클래스에 정의되어 있으므로 XJC는 "상속 클래스"에서 해당 속성을 생성하지 않습니다.

제게 도움이되는 내용은 reported on restrictions in JAXB RI입니다. 제한에 의한 유도는 JAXB의 어려운 개념 인 것 같습니다.

예를 들어,이 경우 - GenericDataType은 어떻게 생겼을 것이라고 생각하십니까? 보다 구체적인 유형을 사용하려면 기본적으로 header 속성을 재정의해야합니다. XJC는 getters/setter가 아닌 fields에 주석을 배치하기 때문에 그러한 속성을 어떻게 무시할 수 있을지 궁금합니다. 헤더 속성을 추가하여 header을 처리 할 수 ​​있습니까?

이러한 클래스를 수동으로 작성하고 jaxb:class/@ref 바인딩을 사용하십시오. 당신이 그것을 작동하게한다면, 이것은 무엇이 생성되어야하는지에 대한 아이디어를 줄 것입니다.

다음으로 XJC 플러그인을 통해 가능한지 여부.

여기에보고 한 문제는 실제로 XJC의 핵심 비즈니스입니다. 무언가가 거기에서 작동하지 않는다면 "좋은"것은 XJC에서 문제를보고하고 (이미보고 된 문제를 찾아서) 문제를 해결하는 것입니다.

XJC 플러그인은 실제로 많은 작업을 수행 할 수 있습니다. 모델을 완전히 재구성하고 생성을 사용자 정의 할 수 있습니다. 적절한 노력으로 모든 것이 가능합니다.

하지만이 경우 위험한 시도 일 수 있습니다. 고급 XJC 플러그인 작성은 쉽지 않습니다.

플러그인이 수행해야하는 작업과 스키마 파생 클래스에서이 특정 문제를 해결할 수있는 방법에 대해 잘 알고 있다면 의견을 게시 해주세요. 몇 가지 지침을 제공 할 수 있습니다. 나 개인적으로, 나는 아마도 다른 사람보다 더 많은 XJC 플러그인을 작성했을 것이다.

이 정보가 도움이되기를 바랍니다.

+0

제한 기본 속성을 부모 관계로 변환해야하는 이유는 무엇입니까? 간단히 평평하게 만들고 부모 클래스를 사용하지 않고 클래스 계층을 전혀 사용하지 않고 GenericDataType을 정의하지 않는 이유는 무엇입니까? xsd 제한 기본 속성은 xsds를 쉽게 작성할 수있는 단축키처럼 보입니다 ... 그 이상의 목적이 있습니까? – user1050755

+0

@ user1050755 당신 말이 맞을지 모릅니다. 이것은 평평하게 할 수 있습니다. 그러나 이것은 상속을 깨뜨릴 수도 있습니다. 확실하지 않습니다. 따라서 손으로 작성한 클래스 ('jaxb : class/@ ref')에 매핑하여 Java 클래스의 작업 세트가 어떻게 생겼는지 알아내는 제안. 그러면 이것이 플러그인으로 가능한지 아닌지 말할 수 있습니다. 당신 말이 맞을지 모르지만, 귀하의 접근 방식은 현재 합리적인 것처럼 보입니다. 미리 플러그인에 너무 많은 시간을 투자하지 않도록주의하십시오. – lexicore

관련 문제