2009-03-31 2 views
1

У меня есть эта схема:Castor демаршаллинга исключение требовательны при условии поля

<?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> 

Как вы можете видеть, элемент «ЗПИФ» обязательна. Я уже создал классы, которые сопоставляются с схемами с 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» (чье имя XML является «ЗПИФ») является обязательное поле класса «XML.entities.Consulta»

Любые идеи, почему?

Вот сгенерированный класс для Consulta (комментарии удалены ...)

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); 
    } 

} 
+0

Примечание: Если вы создаете строку в один присест, а не использовать StringBuffer, как вы сделали, вы можете просто сказать строка XML = «" + "" + "" + .... и компилятор будет обрабатывать это ОЧЕНЬ эффективно. Пока это один оператор Java. – Eddie

ответ

0

Без вас, показывая свой класс Java, я предполагаю, что вы не имеете метод установки setCuit(String) но только имеют атрибут объявлен как public String _cuit?

+0

Привет. У меня есть сеттер ... Я редактировал вопрос, чтобы добавить класс. –

+0

И вы не используете какой-либо конкретный файл сопоставления Castor, верно? Действительно ли Кастор признает в течение ? Интересно, какая из двух строк на самом деле бросает исключение: Unmarshaller.unmarshal или con.validate. – Arjan

+0

Нет файла сопоставления. Я предполагаю, что он распознает , потому что он жалуется на своего ребенка ... строка, которая бросает MarshalException, является методом unmarshal(). –

0

Я не знаю, является ли это вашей конкретной проблемой или нет, но вы, вероятно, не хотите <xs:all>, а вместо этого <xs:sequence>. То есть, ваша схема должна быть:

<?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> 
+0

Если я правильно понимаю, единственное различие между «последовательностью» и «всем» заключается в том, что предыдущий применяет детский порядок. В любом случае я попробовал ваше предложение, но у меня получается то же самое ... –

+0

В этом случае я попробую это позже сегодня и откликнусь тем, что вижу. – Eddie

+0

Для меня, используя Castor 1.3, ваш код запускается и проверяется, поэтому есть некоторые неочевидные проблемы. Какую версию Castor вы используете? Попробуйте 1.3. – Eddie

Смежные вопросы