使用 JAXB schemagen 工具根据 Java 类生成 XML 模式文件

使用 Java™ XML 绑定体系结构 (JAXB) schemagen 工具根据 Java 类生成 XML 模式文件。

开始之前

标识 Java 类或一组 Java 对象以映射到 XML 模式文件。

关于此任务

使用 JAXB API 和工具以在 Java 类和 XML 模式之间建立映射。XML 模式文档描述了 XML 文档中的数据元素和关系。在数据映射或绑定存在后,可以在 XML 文档和 Java 对象之间进行转换。现在不必理解数据结构即可访问 XML 文档中存储的数据。

要从现有的 JavaBeans 或企业 Bean 着手使用自底向上式开发方法来开发 Web Service,请使用 wsgen 工具为 Java API for XML-Based Web Services (JAX-WS) 应用程序生成工件。为应用程序生成 Java 工件后,可以通过使用 JAXB 模式生成者 schemagen 命令行工具从表示 Java 应用程序的数据元素的现有 Java 应用程序创建 XML 模式文档。JAXB 模式生成者处理 Java 源文件或类文件。Java 类注释能够定制从现有 Java 类到生成的模式组件的缺省映射。XML 模式文件以及注释的 Java 类文件包含 JAXB 运行时解析 XML 文档以进行编组和取消编组所需的所有必需信息。

通过使用 JAXB 模式生成者 schemagen 命令行工具,可以根据表示 Java 应用程序的数据元素的现有 Java 应用程序创建 XML 模式文档。JAXB 模式生成者处理 Java 源文件或类文件。Java 类注释能够定制从现有 Java 类到生成的模式组件的缺省映射。XML 模式文件以及注释的 Java 类文件包含 JAXB 运行时解析 XML 文档以进行编组和取消编组所需的所有必需信息。

支持的配置 支持的配置: z/OS® 平台不支持 wsimportwsgenschemagenxjc 命令行工具。随在 z/OS 平台上运行的 WebSphere® Application Server 一起提供的组装工具提供了此功能。请针对 JAX-WS 应用程序查看这些命令行工具,以更多地了解这些工具。sptcfg
最佳实践 最佳实践: WebSphere Application Server 提供 Java API for XML-Based Web Services (JAX-WS) 和 Java XML 绑定体系结构 (JAXB) 工具。wsimportwsgenschemagenxjc 命令行工具位于 WebSphere Application Server(传统)app_server_root\bin\ 目录中。xjcschemagen 命令位于 Liberty 概要文件中的 app_server_root\jaxb\bin\ 目录中。在某些情况下,由 WebSphere Application Server 提供的工具以及 JDK 两者所生成的工件支持相同级别的规范。总之,JDK 工具生成的工件可在其他顺应的运行时环境之间移植。然则,最好是使用本产品附带提供的工具来在 WebSphere Application Server 环境内实现无缝集成并利用可能仅在 WebSphere Application Server 中受支持的功能部件。要利用 JAX-WS 和 JAXB V2.2 工具,请使用应用程序服务器附带提供的工具,这些工具位于 app_server_root\bin\ 目录。bprac
支持的配置 支持的配置: 此产品支持 JAXB 2.2 规范。JAX-WS 2.2 要求使用 JAXB 2.2 进行数据绑定。sptcfg

JAXB 提供编译支持,让您可以配置 schemagen 模式生成者,以便它不会自动生成新的模式。 如果要使用公共模式(例如万维网联盟 (W3C)、XML 模式、Web 服务描述语言 (WSDL) 或 WS-Addressing)并且不想为引用的特定包生成新模式,那么此改进很有用。@XmlSchema 注释上的 location 属性使 schemagen 生成者可以引用现有模式的 URI,而不是生成新的模式。

除了从命令行使用 schemagen 工具外,还可以从 Ant 构建环境中调用此 JAXB 工具。 从 Ant 构建环境中使用 com.sun.tools.jxc.SchemaGenTask Ant 任务来调用 schemagen 模式生成器工具。为了正常运行,此 Ant 任务需要您使用 ws_ant 脚本来调用 Ant。

避免故障 避免故障: 在运行 schemagen 工具时,模式生成者未正确地从 package-info 类文件读取 @XmlSchema 注释来派生 targetNamespaces。请使用下列其中一种方法来取代使用 @XMLSchema 注释:
  • 提供一个具有 @XmlSchema 的 package-info.java 文件;例如:
    schemagen sample.Address sample\package-info.java
  • 使用 @XmlType 注释名称空间属性来指定名称空间;例如:
    @XmlType(namespace="http://myNameSpace")
gotcha

过程

  1. 找到 Java 源文件或 Java 类文件以用于生成 XML 模式文件。 确保 Java 类文件引用的所有类都包含在类路径中,或通过使用 -classpath/-cp 选项提供给工具。
  2. 使用 JAXB 模式生成者 schemagen 命令来生成 XML 模式。 模式生成者位于 app_server_root\bin\ 目录中。
    [Windows]
    app_server_root\bin\schemagen.bat myObj1.java myObj2.java
    [AIX][HP-UX][Linux][Solaris]
    app_server_root/bin/schemagen.sh myObj1.java myObj2.java
    [IBM i]
    app_server_root/bin/schemagen myObj1.java myObj2.java

    参数 myObj1.javamyObj2.java 是包含数据对象的 Java 文件的名称。如果 myObj1.javamyObj2.java 引用未传递至 schemagen 命令的 Java 类,那么必须使用 -cp 选项为这些 Java 类提供类路径位置。

    阅读 schemagen 命令以了解有关此命令的更多信息以及可以指定的其他选项。
  3. (可选)使用在 javax.xml.bind.annotations 包中定义的 JAXB 程序注释来定制 JAXB XML 模式映射。
  4. (可选)在 @XmlSchema 注释上配置 location 属性以向模式编译器表示是使用现有模式,而不是生成新的模式。 例如,
    @XmlSchema(namespace="foo")
    package foo;
    @XmlType
    class Foo {
    @XmlElement Bar zot;
    }
    @XmlSchema(namespace="bar",
    location="http://example.org/test.xsd")
    package bar;
    @XmlType
    class Bar {
    ...
    }
    <xs:schema targetNamespace="foo">
    <xs:import namespace="bar"
    schemaLocation="http://example.org/test.xsd"/>
    <xs:complexType name="foo">
    <xs:sequence>
    <xs:element name="zot" type="bar:Bar" xmlns:bar="bar"/>
    </xs:sequence>
    </xs:complex
    location="http://example.org/test.xsd"schemagen 工具表示现有模式上的位置并且不会生成新的模式。

结果

既然已根据 Java 类生成 XML 模式文件,那么可以将 Java 对象作为 XML 实例文档进行编组和取消编组。

避免故障 避免故障: schemagen 命令不区分在不同的 Java 包中定义了相同的 @XMLType 名称的多个 @XMLType 注释之间的 XML 名称空间。 如果出现了这种情况,那么将产生以下错误:
Error: Two classes have the same XML type name ....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
此错误指示您具有同名的类或 @XMLType.name 值,但它们存在于不同的 Java 包中。要防止此错误,请将 @XML.Type.namespace 类添加至现有的 @XMLType 注释以区分 XML 类型。gotcha

示例

以下示例说明 JAXB 工具如何根据现有的 Java 类 Bookdata.java 生成 XML 模式文件。
  1. 将以下 Bookdata.java 文件复制到临时目录。
    package generated;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "bookdata", propOrder = {
        "author",
        "title",
        "genre",
        "price",
        "publishDate",
        "description"
    })
    public class Bookdata {
    
        @XmlElement(required = true)
        protected String author;
        @XmlElement(required = true)
        protected String title;
        @XmlElement(required = true)
        protected String genre;
        protected float price;
        @XmlElement(name = "publish_date", required = true)
        protected XMLGregorianCalendar publishDate;
        @XmlElement(required = true)
        protected String description;
        @XmlAttribute
        protected String id;
    
         public String getAuthor() {
            return author;
        }
        public void setAuthor(String value) {
            this.author = value;
        }
        public String getTitle() {
            return title;
        }
    
         public void setTitle(String value) {
            this.title = value;
        }
    
      
        public String getGenre() {
            return genre;
        }
       
        public void setGenre(String value) {
            this.genre = value;
        }
    
        
        public float getPrice() {
            return price;
        }
    
        
        public void setPrice(float value) {
            this.price = value;
        }
    
       
        public XMLGregorianCalendar getPublishDate() {
            return publishDate;
        }
    
        
        public void setPublishDate(XMLGregorianCalendar value) {
            this.publishDate = value;
        }
    
       
        public String getDescription() {
            return description;
        }
    
        
        public void setDescription(String value) {
            this.description = value;
        }
    
       
        public String getId() {
            return id;
        }
    
        
        public void setId(String value) {
            this.id = value;
        }
    
    }
  2. 打开命令提示符。
  3. 从复制 Bookdata.java 文件的目录中运行 schemagen 模式生成器工具。
    [Windows]
    app_server_root\bin\schemagen.bat Bookdata.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh Bookdata.java 
    [IBM i]
    app_server_root/bin/schemagen Bookdata.java
  4. 将生成 XML 模式文件 schema1.xsd
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:complexType name="bookdata">
        <xs:sequence>
          <xs:element name="author" type="xs:string"/>
          <xs:element name="title" type="xs:string"/>
          <xs:element name="genre" type="xs:string"/>
          <xs:element name="price" type="xs:float"/>
          <xs:element name="publish_date" type="xs:anySimpleType"/>
          <xs:element name="description" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"/>
      </xs:complexType>
    </xs:schema>

请参阅 JAXB 引用实现文档以获取有关 schemagen 命令的更多信息。


指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxbjava2schema
文件名:twbs_jaxbjava2schema.html