如何在我想使用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:Method 在com / test / B类中有违法行为 修饰符:0x1001
我试图在两个映射上使用'abstract =“true”',只是为了得到这个例外:
...引起: org.jibx.runtime.JiBXException:无法使用 访问绑定信息 class com.test.A确保绑定 已编译......
我发现的唯一解决方案是让AImpl持有BImpl而不是B,并让getter返回BImpl并且setter接收BImpl。这是非常错误的,因为它完全打破了界面。
我该如何解决这个问题?我一直在拔毛,发脾气(真正的问题要复杂得多,并且JiBX神秘的错误信息没有帮助) - 没有任何帮助。
这可以解决吗? JiBX是否真的具有侵入性(因为它要求我放弃所有接口编程?)
请不要回答“使用AbstractB”,因为它是同一个问题,只删除了一个级别。
答案 0 :(得分:4)
在映射中,您应该能够使用“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对象。或者,如果需要花哨的实例化逻辑,可以使用工厂或自定义序列化器/反序列化器。有关详细信息,请参阅this reference page。
答案 1 :(得分:0)
另一个好的资源是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 - 我只是接受它,因为它没有。左边。 经验教训。