【问题标题】:Castor unmarshalling exception demanding provided fieldCastor 解组异常要求提供的字段
【发布时间】:2009-03-31 20:21:03
【问题描述】:

我有这个架构:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element block="" final="" name="mensaje">
    <xs:complexType>
      <xs:all>
        <xs:element minOccurs="1" maxOccurs="1" name="identificacion" type="Head" />
        <xs:element minOccurs="1" maxOccurs="1" name="consulta">
          <xs:complexType>
            <xs:all>
              <xs:element minOccurs="1" maxOccurs="1" name="cuit" type="xs:string" />
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="Head">
    <!-- etc etc -->
  </xs:complexType>
</xs:schema>

如您所见,元素“cuit”是必需的。我已经使用 Castor 创建了映射到模式的类。但我正在尝试以这种方式测试解组:

public void testCastorUnmarshalling()
{
    String xml = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
    .append("<mensaje>")
    .append("  <identificacion>")
     // etc 
    .append("  </identificacion>")
    .append("  <consulta>")
    .append("    <cuit>35890</cuit>")
    .append("  </consulta>")
    .append("</mensaje>")
    .toString();

    StringReader xmlReader = new StringReader(xml);

    Consulta con = null;
    try {
      con = (Consulta) Unmarshaller.unmarshal(Consulta.class, xmlReader);
      con.validate();
    } catch (ValidationException ex) {
      fail("Validacion: " + ex.getMessage());
    } catch (MarshalException ex) {
      fail("Exception: " + ex.getMessage());
     }
  }

cuit 字段在那里,但我明白了:

例外:字段“_cuit”(其 xml 名称为“cuit”)是类“XML.entities.Consulta”的必填字段

有什么想法吗?

这是为 Consulta 生成的类(已删除 cmets...)

package XML.entities;

import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;

public class Consulta implements java.io.Serializable {

    private java.lang.String _cuit;


    public Consulta() {
        super();
    }

    public java.lang.String getCuit(
    ) {
        return this._cuit;
    }

    public boolean isValid(
    ) {
        try {
            validate();
        } catch (org.exolab.castor.xml.ValidationException vex) {
            return false;
        }
        return true;
    }

    public void marshal(
            final java.io.Writer out)
    throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException {
        Marshaller.marshal(this, out);
    }

    public void marshal(
            final org.xml.sax.ContentHandler handler)
    throws java.io.IOException, org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException {
        Marshaller.marshal(this, handler);
    }

    public void setCuit(
            final java.lang.String cuit) {
        this._cuit = cuit;
    }
    public static XML.entities.Consulta unmarshal(
            final java.io.Reader reader)
    throws org.exolab.castor.xml.MarshalException, org.exolab.castor.xml.ValidationException {
        return (XML.entities.Consulta) Unmarshaller.unmarshal(XML.entities.Consulta.class, reader);
    }

    public void validate(
    )
    throws org.exolab.castor.xml.ValidationException {
        org.exolab.castor.xml.Validator validator = new org.exolab.castor.xml.Validator();
        validator.validate(this);
    }

}

【问题讨论】:

  • 注意:如果你是一次性创建一个字符串,而不是像以前那样使用 StringBuffer,你可以说 String xml = "" + "" + " " + .... 编译器会非常有效地处理这个问题。只要它是一个 Java 语句。

标签: java castor


【解决方案1】:

如果你不展示你的 Java 类,我猜你没有 setter 方法 setCuit(String),但只有一个声明为 public String _cuit 的属性?

【讨论】:

  • 嗨。二传手在那里......我已经编辑了问题以添加课程。
  • 而且您没有使用任何特定的 Castor 映射文件,对吧?那么 Castor 真的能识别 中的 吗?我想知道这两行中的哪一行实际上引发了异常:Unmarshaller.unmarshal 或 con.validate。
  • 无映射文件。我假设它识别 因为它抱怨它的孩子......抛出 MarshalException 的行是 unmarshal() 方法。
【解决方案2】:

我不知道这是否是您的确切问题,但您可能不想要&lt;xs:all&gt;,而是想要&lt;xs:sequence&gt;。也就是说,您的架构应该是:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element block="" final="" name="mensaje">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="identificacion" type="Head" />
        <xs:element minOccurs="1" maxOccurs="1" name="consulta">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="cuit" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="Head">
    <!-- etc etc -->
  </xs:complexType>
</xs:schema>

【讨论】:

  • 如果我理解正确,'sequence' 和 'all' 之间的唯一区别是前者强制执行子命令。无论如何我尝试了你的建议,但我得到了同样的结果......
  • 在这种情况下,我会在今天晚些时候尝试这个,然后用我看到的内容回复。
  • 对我来说,使用 Castor 1.3,您的代码会运行并验证,因此存在一些不明显的问题。您使用的是哪个版本的 Castor?试试 1.3。
  • 感谢您抽出宝贵时间,我会在星期一检查...但出于沮丧,我已经在那个项目中放弃了 Castor!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多