2015-03-09 4 views
0

У меня проблема, которую трудно понять, трудно исправить (для меня).XSTREAM - исключение класса cast

У меня есть файл XML, как это:

<class name='package.AnnotatedClass2'> 
     <attribute name='field1'> 
     <attributes> 
      <attribute name='targetField1name' /> 
      <attribute name='targetField2name' /> 
     </attributes> 
     </attribute> 
    </class> 

У меня есть еще один компонент, который содержит "атрибут" тег (но не присутствует в файле XML), глобальный узел:

<class name="package.Example"> 
    <global> 
     <excluded> 
      <attribute name ="field3"/> 
     </excluded> 
    </global> 
    </class> 

XmlClass которые остаются для <class> тега

public class XmlClass { 

    /** global configuration */ 
    public XmlGlobal global; 
    /** list of attributes node */ 
    @XStreamImplicit(itemFieldName="attribute") 
    public List<XmlAttribute> attributes; 
} 

XmlGlobal, что остаться на <global> тегов

public class XmlGlobal { 
    public List<XmlTargetExcludedAttribute> excluded; 
} 

@XStreamAlias("attribute") 
public class XmlTargetExcludedAttribute { 
    /** name attribute of class node */ 
    @XStreamAsAttribute 
    public String name; 
} 

И XmlAttribute:

public class XmlAttribute { 

    /** list of target attributes */ 
    public List<XmlTargetAttribute> attributes; 
} 

@XStreamAlias("attribute") 
public class XmlTargetAttribute { 

    /** name attribute of attribute node */ 
    @XStreamAsAttribute 
    public String name; 
} 

После того, как метод зрелищно ToXml() в xmlAttribute.attributes у меня есть два экземпляра XmlTargetExcludedAttribute вместо XmlTargetAttribute.

, если быть точным: классы XmlTargetExcludedAttribute и XmlTargetAttribute идентичны только для удобства чтения, на самом деле они разные.

Как я могу объяснить этот класс для использования?

+0

Пожалуйста, покажите реальный код Java для Aelement и Belement (или, по крайней мере, некоторые код, который является действительным Java и демонстрирует проблему). Ваш текущий 'public Anode;' не является допустимым объявлением поля Java, но если у вас есть 'public Anode node; '(и удалены аннотации псевдонима в классах узлов), то он должен работать так, как вам нужно. –

+0

Я проверил ваш пример (исправляя ошибки компиляции), и он работает так, как вы ожидали. Не могли бы вы рассказать? – antonio

+0

Я обновил сообщение, спасибо за помощь – Alessandro

ответ

1

Вместо наложения двух различных классов во всем мире, можно зарегистрировать местную NamedCollectionConverter по каждому из списка многозначных свойств:

public class XmlGlobal { 
    @XStreamConverter(value=NamedCollectionConverter.class, useImplicitType=false, 
     strings={"attribute"}, types={XmlTargetExcludedAttribute.class}) 
    public List<XmlTargetExcludedAttribute> excluded; 
} 

public class XmlTargetExcludedAttribute { 
    /** name attribute of class node */ 
    @XStreamAsAttribute 
    public String name; 
} 


public class XmlAttribute { 

    /** list of target attributes */ 
    @XStreamConverter(value=NamedCollectionConverter.class, useImplicitType=false, 
     strings={"attribute"}, types={XmlTargetAttribute.class}) 
    public List<XmlTargetAttribute> attributes; 
} 

public class XmlTargetAttribute { 

    /** name attribute of attribute node */ 
    @XStreamAsAttribute 
    public String name; 
} 
+0

это работает, спасибо – Alessandro