2009-06-11 3 views
3

JiBX 바인딩을 사용하려는 클래스에서 사용중인 인터페이스를 어떻게 유지할 수 있습니까?JiBX : 코드에서 인터페이스를 계속 사용하려면 어떻게해야합니까?

예 :

public interface A { 
    B getB(); 
    void setB(B b); 
} 

public interface B { 
    String getData(); 
    void setData(String data); 
} 

public class AImpl implements A { 
    B b; 

    @Override 
    public B getB() { 
     return b; 
    } 

    @Override 
    public void setB(B b) { 
     this.b = b;  
    } 
} 

public class BImpl implements B { 
    private String data; 
    @Override 
    public String getData() { 
     return data; 
    } 

    @Override 
    public void setData(String data) { 
     this.data = data; 
    } 
} 

그리고이 된 문서가 :

: 내 코드를 실행하려고하면

<binding> 
<mapping name="A" 
     class="com.test.AImpl"> 
    <structure name="B" usage="optional" get-method="getB" set-method="setB"/> 
</mapping> 
<mapping name="B" 
     class="com.test.BImpl"> 
    <value name="data" set-method="setData" get-method="getData" usage="optional"/> 
</mapping> 
</binding> 

나는이 예외가 나는이 아주 간단한 자바의 모델이

java.lang.ClassFormatError: Method in class com/test/B has illegal modifiers: 0x1001

두 매핑에서 'abstract = "true"'를 사용하려고했습니다.이 exceptio를 얻으려는 것입니다. N :

...Caused by: org.jibx.runtime.JiBXException: Unable to access binding information for class com.test.A Make sure the binding has been compiled...

내가 찾은 유일한 해결책은 AImpl은 B 대신 BImpl를 개최 가지고 있고, 게터 반환 BImpl을 가지고 있고 세터 BImpl을받을. 인터페이스가 완전히 깨지는 것은 매우 잘못되었습니다.

어떻게 해결할 수 있습니까? 내가 머리카락을 꺼내고, 울부 짖음 (진짜 문제는 훨씬 더 복잡하고, JiBX의 비밀스러운 오류 메시지는 도움이되지 않습니다.) 도움이되지 않습니다.

해결할 수 있습니까? JiBX가 정말로 방해가 되는가? (모든 인터페이스 프로그래밍을 포기해야한다는 점에서)

"사용 AbstractB"는 같은 문제이므로 한 단계 만 제거하면 답변하지 마십시오.

답변

4

매핑에서 "create-type"속성을 사용하여 JiBX가 인터페이스 유형이있는 bean 등록 정보에 대해 인스턴스화해야하는 구체적인 클래스를 지정할 수 있어야합니다. 나는 이것을 수집 속성에 많이 사용한다. 예를 들어 java.util.Set의 속성에 대해 java.util.HashSet을 인스턴스화하도록 JiBX에 지시 할 수 있습니다. 그러나 비 수집 속성의 경우에도 잘 작동한다고 생각합니다. 매핑은 다음과 같습니다.

JiBX는 인수 없음 생성자를 호출하여 B 개체를 만듭니다. 또는 고급 인스턴스 생성 논리가 필요한 경우 팩토리 또는 사용자 지정 serializer/deserializer를 사용할 수 있습니다. 자세한 내용은 this reference page을 참조하십시오.

+0

위대한 대답은 하나의 수정입니다. 생성 유형은 최소한 제시된 경우에는 구조가 아닌 B의 매핑에 있어야합니다. 얼마나 많은 시간 동안 나는 그것을 보지 않고 문제를 돌고있다.당신은 방금 내 일을 다시 제정신으로 만들었습니다 :) –

0

또 다른 좋은 리소스는 binding.dtd입니다. 배포판에 없지만 여기에서 다운로드 할 수 있습니다 : http://jibx.cvs.sourceforge.net/viewvc/checkout/jibx/core/docs/binding.dtd. 이 파일을 어딘가에 넣으십시오 (예 : c : \ binding.dtd).

<binding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file://jibx/binding.dtd"> 

을하고 파일을 등록 : 그런 다음, 상단 바인딩 항목에, 이것을 사용 설명서 및 검증 케이크에 저장된 binding.dtd를 가리 키도록 //jibx/binding.dtd.

나는 inertia가하는 일은 놀랍습니다. xml 파일에 스키마/dtds가 있어야한다는 것을 알고 있습니다. 이전에이 파일을 사용했고 항상 "이것을 이해하는 것은 불가능했을 것입니다."라고 말했습니다. 그러나이 프로젝트에 들어갔을 때이 XML에 대한 스키마/dtd를 검색하는 일은 결코 발생하지 않았습니다.
학습 된 교훈.