【问题标题】:Jibx always gives "Error during validation: null"Jibx 总是给出“验证期间出错:null”
【发布时间】:2009-06-30 16:38:41
【问题描述】:

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

<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 中)

我完全被难住了,没有想法。 Google 没有显示任何有用的信息。

【问题讨论】:

    标签: jibx


    【解决方案1】:

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

    在这种情况下,您的绑定声明您有一个名为 &lt;transHeader&gt; 的 XML 元素,该元素不会出现在您的 Java 类中。

    通过对您的 XML 格式进行一些细微的修复,您的绑定可以完美运行。我假设您的绑定有两个 &lt;binding&gt; 打开标签而不是打开和关闭 &lt;binding&gt;&lt;/binding&gt; 是一个错字,因为您说您可以在没有结构的情况下使用它。还要在绑定文件的顶部添加&lt;?xml version="1.0"?&gt;。这两个 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();
            }
        }
    

    并且运行成功。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 2021-05-25
        • 2014-04-22
        • 1970-01-01
        • 2013-06-09
        • 2021-10-19
        相关资源
        最近更新 更多