【问题标题】:XSTREAM - class cast exceptionXSTREAM - 类转换异常
【发布时间】:2015-03-09 11:17:28
【问题描述】:

我有一个容易理解但很难解决的问题(对我来说)。

我有一个这样的 XML 文件:

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

我有另一个包含“属性”标签(但在 XML 文件中不存在)的 bean,全局节点:

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

&lt;class&gt; 标签保留的XmlClass

public class XmlClass {

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

&lt;global&gt; 标签留下的XmlGlobal

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

在 xmlAttribute.attributes 中执行 toXml() 方法后,我有两个 XmlTargetExcludedAttribute 实例,而不是 XmlTargetAttribute。

准确地说:XmlTargetExcludedAttribute 和 XmlTargetAttribute 类相同只是为了便于阅读,实际上它们是不同的。

我该如何解释要使用的那个类?

【问题讨论】:

  • 请显示 Aelement 和 Belement 的实际 Java 代码(或至少是一些有效的 Java 代码并演示问题)。您当前的 public Anode; 不是有效的 Java 字段声明,但如果您有 public Anode node;(并删除了节点类上的别名注释),那么它应该可以按您的要求工作。
  • 我已经测试了您的示例(更正了编译错误),它可以按您的预期工作。能详细点吗?
  • 我已经更新了帖子,感谢您的帮助

标签: java xml xstream


【解决方案1】:

您可以在每个 List 值属性上注册一个本地 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多