簡體   English   中英

JiBX:如何在代碼中繼續使用接口?

[英]JiBX: How do I keep using interfaces in my code?

如何在我想使用JiBX綁定的類中保留我的使用接口?

示例:我在java中有這個非常簡單的模型:

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:類com / test / B中的方法具有非法修飾符:0x1001

我試圖在兩個映射上使用'abstract =“true”',只是為了得到這個異常:

...引起:org.jibx.runtime.JiBXException:無法訪問類com.test.A的綁定信息確保綁定已編譯...

我發現的唯一解決方案是讓AImpl持有BImpl而不是B,並讓getter返回BImpl並且setter接收BImpl。 這是非常錯誤的,因為它完全破壞了界面。

我怎么解決這個問題? 我一直在拔毛,發脾氣(真正的問題要復雜得多,並且JiBX神秘的錯誤信息沒有幫助) - 沒有任何幫助。

這可以解決嗎? JiBX真的那么干擾(因為它需要我放棄所有的接口編程嗎?)

請不要回答“使用AbstractB”,因為它是同一個問題,只刪除了一個級別。

在映射中,您應該能夠使用“create-type”屬性來指定JiBX應該為具有接口類型的bean屬性實例化的具體類。 我對收集屬性使用了很多。 例如,您可以告訴JiBX為java.util.Set類型的屬性實例化java.util.HashSet 但我相信它對非收集屬性也同樣有效。 您的映射看起來像:

<mapping class="com.mypackage.AImpl" name="A">
  <structure get-method="getB" set-method="setB" create-type="com.mypackage.BImpl">
    ...
  </structure>
  ...
</mapping>

JiBX將調用no-arg構造函數來創建B對象。 或者,如果需要花哨的實例化邏輯,可以使用工廠或自定義序列化器/反序列化器。 有關詳細信息,請參閱此參考頁

另一個很好的資源是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">

並注冊file://jibx/binding.dtd以指向您保存的binding.dtd以獲取文檔和驗證信息。

慣性是多么令人驚奇 - 我知道xml文件應該有架構/ dtds,我之前使用過它們並且總是說“沒有架構理解這將是不可能的”。 然而,當我進入這個項目時,我從來沒有想過為這個xml搜索schema / dtd - 我只是接受它,因為它沒有。
學過的知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM