2015-01-07 3 views
0
그것을하려면

JAXB는

(어쩌면 내가 ... 잘못된 키워드를 사용하고, 아무 대답도 이미 그것을 봤없는 한 여기 검색을 수행하고 있음)

a.xsd :를 b.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://foo.bar/something" 
    targetNamespace="http://foo.bar/something" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:complexType name="TFoo"> 
    <xs:attribute name="version" type="xs:string" /> 
    </xs:complexType> 
</xs:schema> 

:

간단한, 나는 두 스키마가

모두 과 같음 targetNamespaceTFoo이라는 complexType이 있습니다.

A-binding.xml :

TFooA에서 TFooa.xsd의 생성 된 클래스 이름을 변경하기 위해 외부 결합이

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    version="2.1"> 

    <jxb:bindings schemaLocation="a.xsd"> 
    <jxb:bindings node="//xs:complexType[@name='TFoo']"> 
     <jxb:class name="TFooA"/> 
    </jxb:bindings> 
    </jxb:bindings> 

</jxb:bindings> 

어느 a.xsd만의 경우 :

나는 한 번에 두 스키마를 컴파일하려고하면
$ xjc -b a-binding.xml a.xsd 
parsing a schema... 
compiling a schema... 
bar/foo/something/ObjectFactory.java 
bar/foo/something/TFooA.java 
bar/foo/something/package-info.java 

,

(내가 TFoo 된 .java을 가지고 어떻게 보면)하지만, 내가 얻을 :

$ xjc -b a-binding.xml a.xsd b.xsd 
parsing a schema... 
[ERROR] 'TFoo' is already defined 
    line 13 of file:/home/scherrer/tmp/PL_008f/b.xsd 

[ERROR] (related to above error) the first definition appears here 
    line 9 of file:/home/scherrer/tmp/PL_008f/a.xsd 

Failed to parse a schema. 

내가 TFoo을 알고은 두 번 정의되었으므로 충돌을 해결하기 위해 외부 바인딩을 사용합니다.

Obs. 두 스키마가 모두 허구이며, 문제의 원인을 설명하기 위해 작성되었으며, 실제 스키마는 제 3 자에 의해 제공되며 나는 변경할 수 없습니다.

아무도 xjc 제한 사항 (here은 표시되지 않음)이거나 전혀 작동하지 않아야한다고 말할 수 있습니까? 아니면 버그일까요?

미리 감사드립니다.

+0

간단히 말해서,이 조합이 유효하지 않으므로이 두 스키마를 함께 컴파일 할 수 없습니다. – lexicore

답변

2

같은 이름 공간을 정의하는 2 개의 서로 다른 스키마 문서 (그리고 심지어 더 나쁜 요소)를 갖는 것은 2 개의 서로 다른 jar가 패키지에서 동일한 패키지와 동일한 클래스를 포함하는 것과 같습니다. 이것은 jaxb 자체의 제한이 아니며 스키마 이름 공간의 의미를 침해합니다.

즉, 이러한 스키마를 함께 처리 할 수 ​​없습니다.

생성자는 참조 할 항목을 모르기 때문에 클래스를 만들 수 없습니다. 이름을 변경하려고 시도하기 전에 오류가 발생합니다. 스키마를 읽을 때 발생합니다.

당신이 할 수있는 일은 스키마를 별도로 처리하고 사용되는 자바 패키지 이름을 변경하는 것입니다. 이렇게하면 Java 패키지 공간에서 이름 충돌을 피할 수 있으며 기본적으로 스키마 문서를 서로에 대한 참조없이 완전히 별도의 엔터티로 취급합니다. 바인딩에 사용할 패키지 이름을 정의하여이 작업을 수행 할 수 있습니다.

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    version="2.1"> 
    <jxb:bindings schemaLocation="a.xsd" node="/xs:schema"> 
     <jxb:schemaBindings> 
     <jxb:package name="com.foo.a"></jxb:package> 
     </jxb:schemaBindings> 
    </jxb:bindings> 
</jxb:bindings> 
+0

필자의 경우 별도로 컴파일 할 때의 문제점은 두 스키마 모두 세 번째 스키마를 포함한다는 것입니다. ** types.xsd **는 많은 다른 스키마에서 사용되는 많은 공통 유형을 선언하고, * 같은 targetNamespace **. 따라서 개별적으로 컴파일하면 다른 패키지에 12 개의 중복 클래스가 생깁니다. 나는 에피소드 ** 확장을 사용하여 ** types.xsd ** 에피소드 파일을 생성 해 보았지만 사용하려고 할 때 동일한 targetNamespace로 생각한다. ('xjc -extension - b types.episode a.xsd'), 아무것도 생성되지 않습니다. – fscherrer

+0

이것은 단순히 스키마 네임 스페이스의 완전히 잘못된 것입니다. 이것을 jaxb와 함께 사용하게하는 유일한 방법은 types.xsd를 사용하여 a.xsd를 생성하고 java 이름 공간 1을 강제로 만들고 types.xsd를 사용하여 b.xsd를 생성하는 것과는 완전히 별개의 방법입니다. –

+0

"java name space 1"을 (를) 강제한다는 것은 무엇을 의미합니까? 미안, 이해 못 했어. 나는 ** episode **로 해결 된 문제를 얻었고, 생성 된 _episode_ 파일을 변경했다 ('false' 대신'). 또 다른 문제가 있습니다. 아직 언급하지 않은 시나리오의 또 다른 부분 때문입니다. 나는 실제 시나리오로 내 테스트를 마쳤으므로 내가 얻은 결과로 질문을 업데이트 할 수있다. 나는 그 질문에 답할 때 당신의 대답을 받아들입니다. – fscherrer

-1

데이터 바인딩의 제한 사항을 발견했다고 생각합니다. 대신 data projection을 시도하십시오 (공개 : 해당 프로젝트의 계열사 인). 스키마 b.xsd는 a.xsd의 확장과 모양이 같습니다. b.xsd에 적합한 투영 인터페이스를 작성하고 a.xsd 또는 b.xsd에 맞는 모든 문서와 함께 사용할 수 있습니다.

+0

본 데이터 프로젝션 라이브러리에 가입 했습니까? – lexicore

+0

예, 있습니다. 이것은 어떤 방향 으로든 대답의 유용성을 바꾸는가? IMHO 예, 내가 말하는 것에 대해 알고 있기 때문입니다. – Cfx

+0

요점은 당신이 [귀하의 소속을 공개해야합니다] (http://stackoverflow.com/help/behavior)입니다. – lexicore