我真的很难过这个非常简单的映射。它看起来就像其中一个例子。如果我注释掉内部结构,它将成功运行绑定编译器。如果我重新放入内部结构,它就会失败。请注意,内部结构只是定义XML。这基本上是JIBX教程示例的示例。
<binding>
<mapping name="RequestTransaction" class="TransactionRequest">
<value name="version" set-method="setVersion" get-method="getVersion" style="attribute" />
<structure name="transHeader">
<value name="requestCount" set-method="setRequestCount" get-method="getRequestCount"/>
</structure>
</mapping>
<binding>
然后我在jibx compile上得到以下错误:
错误:验证期间出错:null; on mapping元素(第2行,第97行,在jibx-binding.xml中)
我绝对难以理解。谷歌没有任何用处。
答案 0 :(得分:1)
<structure>
可以说是JiBX绑定中最重要的概念,因为它允许您将任意XML映射到Java类,而不会强迫您创建膨胀和丑陋的嵌套Java对象和类层以匹配XML设计
在这种情况下,绑定声明您有一个名为<transHeader>
的XML元素,它不会出现在您的Java类中。
通过对XML格式的一些细微修复,您的绑定可以完美运行。我假设你的绑定有两个<binding>
开放标签,而不是打开和关闭<binding></binding>
是一个错字,因为你说你没有结构就可以使用它。还要在绑定文件的顶部添加<?xml version="1.0"?>
。这两个XML模块允许JiBX 1.2绑定编译器使用以下Java类:
(注意:你没有提供这个绑定的Java类,所以我不得不从你在绑定文件中放入的信息重建它。这明显的副作用是我重建了一个可以使用的类这个简单的事实是,设计的JiBX绑定包含了你需要了解的关于类和XML的所有信息。)
public class TransactionRequest {
private String version;
private int requestCount;
public void setVersion(String ver) {
version = ver;
}
public String getVersion() {
return version;
}
public void setRequestCount(int count) {
requestCount = count;
}
public int getRequestCount() {
return requestCount;
}
}
编译该类,然后运行绑定编译器:
>java -jar jibx-bind.jar jibx-binding.xml
为了测试它,我使用了以下sample.xml:
(注意:您也没有提供您尝试映射的XML,所以我再次根据您提供的内容创建了一个示例)
<?xml version="1.0"?>
<RequestTransaction version="0.1">
<transHeader>
<requestCount>3</requestCount>
</transHeader>
</RequestTransaction>
运行测试使用以下代码:
public static void main(String[] argz) {
String fileName = "./sample.xml";
IBindingFactory bfact = null;
IUnmarshallingContext uctx = null;
TransactionRequest sample = null;
try {
bfact = BindingDirectory.getFactory(TransactionRequest.class);
uctx = bfact.createUnmarshallingContext();
InputStream in = new FileInputStream(fileName);
sample = (TransactionRequest)uctx.unmarshalDocument(in, null);
System.out.println(sample.getRequestCount());
System.out.println(sample.getVersion());
}
catch (Exception e) {
e.printStackTrace();
}
}
它成功运行。
答案 1 :(得分:0)
现在已经有一段时间了,但我发现它与继承有关。我需要为继承树中的所有内容提供映射,包括我记得的接口。
我最终创建了一个包装器对象,我发现它似乎是一般使用JIBX的最简单方法。尝试映射一个真正的域类会导致卷须进入类触及的每个类,我必须解开所有内容,以便JIBX可以找到类,包括第三方库。