【问题标题】:Getting namespace of an @XmlType at runtime在运行时获取 @XmlType 的命名空间
【发布时间】:2012-04-30 12:57:36
【问题描述】:

我试图在编组xjc 生成的类实例时正确输出schemaLocation 属性。根元素类如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "rootElement"
})
@XmlRootElement(name = "ROOTELEMENT")
public class ROOTELEMENT {
    // Members
}

我看到包中有一个package-info.java 类,所有生成的类都在其中,内容如下:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://my.own.namespace", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package my.generated.classes.package;

JAXB XJC code generation - “schemaLocation” missing in xml generated by Marshaller的答案建议设置Marshaller.JAXB_SCHEMA_LOCATION属性,确实有效:

marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://my.own.namespace my_schema.xsd");

但我想避免输入命名空间,如:

String namespace = getNamespace(rootElementInstance);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, namespace + " my_schema.xsd");

如果有任何关于如何实现 getNamespace() 函数的提示,我将不胜感激。


编辑:我看到XmlRootElementXmlType 注释具有namespace() 方法,这似乎是我所追求的(实际上,他们似乎委托package-info.java 中提供的 XmlSchema)。但是,我无法将ROOTELEMENT 的实例转换为这些类型中的任何一个。

【问题讨论】:

    标签: java xml xml-serialization jaxb


    【解决方案1】:

    您需要抓住您的包裹(例如,如果 ROOTELEMENT 在您想要的包裹中,则使用 ROOTELEMENT.class.getPackage())。然后你可以简单地处理如下:

    Package package = // Here retrieve the package;
    String namespace = package.getAnnotation(XmlSchema.class).namespace();
    ...etc...
    

    【讨论】:

    • 那行得通。很高兴学到了一些新东西。谢谢你。但是,我希望 JAXB 提供一种不那么“手动”的方式来实现这一点。我暂时不接受答案,以防有其他更优雅的选择。
    • +1 - @XaviLópez - JAXB (JSR-222) 目前不提供 API 来检查元数据(也许它应该提供类似 JPA 的东西)。这里给出的方法可能是你最好的选择。
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2022-01-05
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多