2

我真的被这个非常简单的映射难住了。它甚至看起来就像其中一个例子。如果我注释掉内部结构,它将成功运行绑定编译器。如果我把内部结构放回去,它就会失败。请注意,内部结构只是定义 XML。这基本上是 JIBX 教程示例的示例 5。

<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 编译时收到以下错误:

错误:验证期间出错:null;在映射元素上(第 2 行,第 97 列,在 jibx-binding.xml 中)

我完全被难住了,没有想法。谷歌显示没有任何用处。

4

2 回答 2

1

可以说是 JiBX 绑定中最<structure>重要的概念,因为它允许您将任意 XML 映射到您的 Java 类,而不会强迫您创建臃肿和丑陋的嵌套 Java 对象和类层以匹配 XML 设计。

在这种情况下,您的绑定声明您有一个名为的 XML 元素<transHeader>,该元素不会出现在您的 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();
        }
    }

它运行成功。

于 2009-08-05T13:19:03.007 回答
0

现在已经有一段时间了,但我发现它与继承有关。我需要为继承树中的所有内容提供映射,包括我记得的接口。

我最终创建了一个包装器对象,我发现它似乎是一般使用 JIBX 的最简单方法。尝试映射一个真正的域类会导致卷须进入该类所涉及的每个类,我必须解压缩所有内容,以便 JIBX 可以找到这些类,包括 3rd 方库。

于 2009-08-06T14:57:17.053 回答