Jibx总是给出“验证时出错:null”

时间:2009-06-30 16:38:42

标签: jibx

我真的很难过这个非常简单的映射。它看起来就像其中一个例子。如果我注释掉内部结构,它将成功运行绑定编译器。如果我重新放入内部结构,它就会失败。请注意,内部结构只是定义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中)

我绝对难以理解。谷歌没有任何用处。

2 个答案:

答案 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可以找到类,包括第三方库。