3

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にBではなくBImplを保持させ、ゲッターにBImplを返し、セッターにBImplを受信させることです。これは、インターフェイスを完全に破壊するため、非常に間違っています。

どうすればこれを解決できますか?私は髪の毛を抜いて、タントラムを持っています(実際の問​​題ははるかに複雑で、JiBXの不可解なエラーメッセージは役に立ちません)-何も役に立ちません。

これは解決可能ですか?JiBXは本当にそれほど煩わしいですか(すべてのインターフェイスプログラミングを放棄する必要があるという点で?)

同じ問題であり、1つのレベルのみが削除されているため、「AbstractBを使用」とは答えないでください。

4

2 に答える 2

4

マッピングでは、「create-type」属性を使用して、インターフェイスタイプを持つBeanプロパティに対してJiBXがインスタンス化する具象クラスを指定できる必要があります。私はこれをコレクションのプロパティによく使用します。たとえば、タイプjava.util.Setのプロパティに対してjava.util.HashSetをインスタンス化するようにJiBXに指示できます。ただし、コレクション以外のプロパティでも同様に機能すると思います。マッピングは次のようになります。

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

JiBXは、引数なしのコンストラクターを呼び出してBオブジェクトを作成します。または、派手なインスタンス化ロジックが必要な場合は、ファクトリまたはカスタムのシリアライザー/デシリアライザーを使用できます。詳細については、このリファレンスページを参照してください。

于 2009-06-11T18:24:31.523 に答える
0

もう1つの優れたリソースは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のスキーマ/ dtdを検索することは思いもよらなかった-何もなかったので、私はそれを受け入れた。
学んだ教訓。

于 2009-06-11T23:04:04.113 に答える