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

如何在我想使用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; } } 

而这个绑定文件:

         

当我尝试运行我的代码时,我得到了这个exception:

java.lang.ClassFormatError:类com / test / B中的方法具有非法修饰符:0x1001

我试图在两个映射上使用’abstract =“true”’,只是为了得到这个exception:

…引起: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 。 但我相信它对非收集属性也同样有效。 您的映射看起来像:

   ...  ...  

JiBX将调用no-arg构造函数来创建B对象。 或者,如果需要花哨的实例化逻辑,可以使用工厂或自定义序列化器/反序列化器。 有关详细信息,请参阅此参考页

另一个很好的资源是binding.dtd – 显然它不在发行版中,但可以从这里下载: http : //jibx.cvs.sourceforge.net/viewvc/ checkout /jibx/core/docs/binding.dtd 。 将此文件放在某处(例如c:\ binding.dtd)。 然后,在顶部绑定条目中,使用:

  

并注册file://jibx/binding.dtd以指向您保存的binding.dtd以获取文档和validation信息。

惯性是多么令人惊讶 – 我知道xml文件应该有架构/ dtds,我之前使用过它们并且总是说“没有架构理解这将是不可能的”。 然而,当我进入这个项目时,我从来没有想过为这个xml搜索schema / dtd – 我只是接受它,因为它没有。
学过的知识。