【问题标题】:Class Casting during Marshalling of JAXBJAXB 编组期间的类转换
【发布时间】:2015-04-23 04:01:10
【问题描述】:

目标:尝试通过参数c 传递任何类,以便任何类都可以直接使用编组。

错误:[com.sun.istack.internal.SAXException2:无法将类型“java.lang.Class”编组为元素,因为它缺少@XmlRootElement 注释]

此错误出现在箭头所指的行(-->)

评论:如果我尝试在第 8 行和第 9 行使用来自实际类的表达式更改 c,那么这很好。有没有办法不这样做。我认为类强制转换不是选项。

public XmlMarshaller(Class c){
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(c);
        Marshaller marshaller = jaxbContext.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        --> marshaller.marshal(c, new File("xmlDyna/asd.xml"));
        --> marshaller.marshal(c, System.out);
    } catch (JAXBException e) {
        e.printStackTrace();
    }
}

这是另一个类,以防有人认为错误与缺少 @XmlRootElement 注释有关。

@XmlRootElement( name = "Dynamic")
public class DynamicLoader {

@XmlElement(name = "name")
public String name = "asdasd";

public DynamicLoader(){
    XmlMarshaller marshaller = new XmlMarshaller(this.getClass());
}

public String getName(){
    return name;
}

【问题讨论】:

  • 为什么要在 xml 中编组 java.lang.Class?
  • 我没有尝试编组 lang.Class 对象。我试图通过(Class c)作为参数传递另一个对象。问题在于 (-->) 而不是 c 它必须是类的名称。你觉得我应该怎么做?

标签: java class casting jaxb marshalling


【解决方案1】:

您应该将Object 作为参数而不是Class 传递。然后确保传递类的实例而不是类本身。然后在object.getClass() 上引导JAXBContext

【讨论】:

  • 我觉得自己很愚蠢 :) ..无论如何感谢 Blaise 的回答。虽然仍然在同一行收到相同的错误消息,但创建了 xml。
【解决方案2】:

您传递的要编组的对象缺少注释。 需要@XmlRootElement 才能定义根元素。同样@XmlAttribute 用于标识xml属性等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多