2009-06-30 2 views
2

정말 믿을 수 없을 정도로 단순한 매핑에 난처한 편입니다. 예제 중 하나처럼 보입니다. 내부 구조를 주석 처리하면 바인딩 컴파일러가 성공적으로 실행됩니다. 내부 구조를 다시 넣으면 실패합니다. 내부 구조는 XML을 정의하는 것입니다. 이것은 기본적으로 JIBX 자습서 예제의 example5입니다.Jibx는 항상 "유효성 검사 도중 오류 : null"을 표시합니다.

오류 : 확인 중 오류 :

<binding> 
    <mapping name="RequestTransaction" class="TransactionRequest"> 
    <value name="version" set-method="setVersion" get-method="getVersion" style="attribute" /> 
    <structure name="transHeader"> 
     <value name="requestCount" set-method="setRequestCount" get-method="getRequestCount"/> 
    </structure> 
    </mapping> 
<binding> 

는 다음 나는 JiBX는 컴파일시에 다음과 같은 에러 얻을 널 (null)을; 매핑 요소에 (줄 2, 열 97, jibx-binding.xml에서)

나는 완전히 엉망이고 생각이 없습니다. Google은 아무런 유용성을 보이지 않습니다.

답변

0

지금은 오래되었지만 유산과 관련이 있다는 것을 알았습니다. 내가 기억하는 인터페이스를 포함하여 상속 트리의 모든 것에 대한 매핑을 제공해야했습니다.

나는 일반적으로 JIBX를 사용하는 가장 쉬운 방법 인 것처럼 보이는 래퍼 객체를 작성했다. 진정한 도메인 클래스를 매핑하려고하면 클래스가 닿는 모든 클래스에 덩굴손이 생기고 JIBX가 제 3 자 라이브러리를 포함한 클래스를 찾을 수 있도록 모든 것을 언저리해야합니다.

1

<structure>은 틀림없이 JiBX 바인딩에서 가장 중요한 개념입니다. 이는 XML 디자인과 일치하도록 중첩 된 Java 객체 및 클래스의 부풀어 지거나 추악한 레이어를 만들지 않고도 임의의 XML을 Java 클래스에 매핑 할 수 있기 때문입니다.

이 경우 바인딩은 Java 클래스에 존재하지 않는 <transHeader>이라는 XML 요소가 있다고 선언합니다.

XML 형식을 약간 수정하면 바인딩이 완벽하게 작동합니다. 나는 당신의 바인딩이 두 개의 <binding> 오픈 태그가 아니라 열린 태그를 가지고 있다고 가정한다. <binding></binding>은 구조가 없어도 작동하기 때문에 오타이다. 또한 바인딩 파일의 맨 위에 <?xml version="1.0"?>을 추가하십시오. 이 두 가지 XML mod는 JiBX 1.2 바인딩 컴파일러가 다음 Java 클래스와 함께 작동하도록 허용합니다.

(참고 :이 바인딩은 자바 클래스를 제공하지 않았기 때문에 내가 작성한 정보에서 재구성해야했습니다. 이 바인딩의 작동에 영향을 줄 수있는 클래스를 재구성 한 것은 명백한 부작용이지만 설계 상 JiBX 바인딩에는 클래스와 XML에 대해 알아야하는 모든 정보가 포함되어 있습니다.

>java -jar jibx-bind.jar jibx-binding.xml 
:
public class TransactionRequest { 
    private String version; 
    private int requestCount; 

    public void setVersion(String ver) { 
     version = ver; 
    } 

    public String getVersion() { 
     return version; 
    } 

    public void setRequestCount(int count) { 
     requestCount = count; 
    } 

    public int getRequestCount() { 
     return requestCount; 
    }  
} 

하면 클래스는 다음과 바인딩 컴파일러를 실행 컴파일 16,

그것을 테스트하기 위해 나는 다음 sample.xml을 사용 :

(참고 : 당신은 또한 당신이 제공 한 일을 기준으로 샘플을 만들어 당신이 그렇게 다시 매핑하려고하는 XML을 제공하지 않았다)

<?xml version="1.0"?> 
<RequestTransaction version="0.1"> 
    <transHeader> 
     <requestCount>3</requestCount> 
    </transHeader> 
</RequestTransaction> 
테스트를 실행

는 다음 코드를 사용합니다

public static void main(String[] argz) { 
     String fileName = "./sample.xml"; 
     IBindingFactory bfact = null; 
     IUnmarshallingContext uctx = null; 
     TransactionRequest sample = null; 
     try { 
      bfact = BindingDirectory.getFactory(TransactionRequest.class); 
      uctx = bfact.createUnmarshallingContext(); 
      InputStream in = new FileInputStream(fileName); 
      sample = (TransactionRequest)uctx.unmarshalDocument(in, null); 
      System.out.println(sample.getRequestCount()); 
      System.out.println(sample.getVersion()); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

을 그리고 그것은 성공적으로 실행됩니다.