2009-06-30 23 views
2

我真的難住這個令人難以置信的簡單映射。它看起來就像其中一個例子。如果我註釋掉內部結構,它將成功運行綁定編譯器。如果我把內部結構放回去,它就會失敗。請注意,內部結構只是定義了XML。這基本上是JIBX教程示例的示例5。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編譯以下錯誤:

錯誤:在驗證過程中錯誤:空;在(第2行,col 97,在jibx-binding.xml中)映射元素上

我絕對難住並且沒有想法。谷歌顯示沒有用。

回答

0

現在已經有一段時間了,但我發現它與繼承有關。我需要爲繼承樹中的所有內容提供映射,包括我記得的接口。

我最終創建了一個包裝對象,我發現它似乎是一般使用JIBX最簡單的方法。試圖映射一個真正的領域類會導致捲入每個類觸及的類,我必須unjar一切,所以JIBX可以找到類,包括第三方庫。

1

<structure>可以說是JiBX綁定中最重要的概念,因爲它允許您將任意XML映射到您的Java類,而不會強制您創建嵌套的Java對象和類的臃腫和醜陋層以匹配XML設計。

在這種情況下,您的綁定聲明您有一個名爲<transHeader>的XML元素,它不會出現在您的Java類中。

對XML格式稍作修改後,您的綁定完美地起作用。我假設你的綁定有兩個<binding>開放標籤而不是開放和關閉<binding></binding>是一個錯字,因爲你說你讓它在沒有結構的情況下工作。還要在您的綁定文件的頂部添加<?xml version="1.0"?>。這兩個XML模塊允許JiBX 1.2綁定編譯器使用以下Java類:

(注意:您沒有提供此綁定所用的Java類,因此我不得不根據您放入的信息重新構建它綁定文件,這樣做的明顯副作用是我重建了一個可以使用該綁定的類,但簡單的事實是,JiBX綁定設計包含了您需要了解的類和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; 
    }  
} 

編譯那麼類運行綁定編譯器:

>java -jar jibx-bind.jar jibx-binding.xml 

爲了測試它,我用下面的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(); 
     } 
    } 

併成功運行。