Java JiBX:如何在代码中继续使用接口?

Java JiBX:如何在代码中继续使用接口?,java,xml,binding,jibx,xml-binding,Java,Xml,Binding,Jibx,Xml Binding,如何在我想使用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

如何在我想使用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真的那么具有侵入性吗(因为它要求我放弃所有的接口编程?)


请不要回答“use 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将调用无参数构造函数来创建B对象。或者,如果需要奇特的实例化逻辑,可以使用工厂或自定义序列化器/反序列化器。有关详细信息,请参阅。

另一个很好的资源是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文件应该有模式/DTD,我以前使用过它们,并且总是说“如果没有模式理解,这是不可能的”。然而,当我进入这个项目时,我从未想过要搜索这个xml的模式/dtd——我只是接受了它,因为它没有模式/dtd。

吸取的经验教训。

答案很好,一个更正-创建类型应该在B的映射上,而不是在结构上(至少在本例中)。令人惊讶的是,我花了多少个小时围绕着这个问题转,却没有看到它。你刚刚让我的工作恢复了理智:)