Java JiBX:如何在代码中继续使用接口?
如何在我想使用JiBX绑定的类中保留我的使用接口 例如: 我有一个非常简单的java模型: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
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的映射上,而不是在结构上(至少在本例中)。令人惊讶的是,我花了多少个小时围绕着这个问题转,却没有看到它。你刚刚让我的工作恢复了理智:)