2

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

@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 代码生成的答案——Marshaller 生成的 xml 中缺少“schemaLocation”建议设置 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()功能的任何提示。


编辑:我已经看到XmlRootElementandXmlType注释具有namespace()方法,这似乎是我所追求的(实际上,它们似乎委托于XmlSchema提供的package-info.java)。但是,我无法获得ROOTELEMENT转换为任何这些类型的实例。

4

1 回答 1

3

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

Package package = // Here retrieve the package;
String namespace = package.getAnnotation(XmlSchema.class).namespace();
...etc...
于 2012-04-30T13:22:08.207 回答