【问题标题】:JiBX: How do I keep using interfaces in my code?JiBX:如何在我的代码中继续使用接口?
【发布时间】:2011-07-07 04:57:14
【问题描述】:

如何在我想使用 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:无法 访问绑定信息 class com.test.A 确保绑定 已编译...

我发现的唯一解决方案是让 AImpl 持有 BImpl 而不是 B,并让 getter 返回 BImpl 并让 setter 接收 BImpl。这是非常错误的,因为它完全破坏了界面。

我该如何解决这个问题?我一直在发脾气,发脾气(真正的问题要复杂得多,JiBX 神秘的错误消息也无济于事)——没有任何帮助。

这可以解决吗? JiBX 真的那么有侵入性吗(因为它要求我放弃所有接口编程?)

请不要回答“使用AbstractB”,因为它是同一个问题,只删除了一个级别。

【问题讨论】:

    标签: java xml binding jibx xml-binding


    【解决方案1】:

    在映射中,您应该能够使用“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 对象。或者,如果您需要花哨的实例化逻辑,您可以使用工厂或自定义序列化器/反序列化器。详情请见this reference page

    【讨论】:

    • 很好的答案,一个更正 - 创建类型应该在 B 的映射上,而不是在结构上(至少在目前的情况下)。令人惊讶的是,我在没有看到它的情况下一直在盘旋这个问题。你刚刚让我的工作再次变得理智:)
    【解决方案2】:

    另一个很好的资源是 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 - 我只是接受它,因为它没有。
    经验教训。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2018-03-16
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多