IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Java technology | XML | Open source  >

JiBX 1.2,第 2 部分: 从 XML 模式到 Java 代码

通过 XML 模式生成更干净的自定义 Java 代码

developerWorks
前一页第 5 页,共 14 页后一页

文档选项

样例代码


对本教程的评价

帮助我们改进这些内容


CodeGen 自定义简介

在本节中,您将了解自定义 CodeGen 以控制通过简单模式生成的代码结构的基础知识。

简单自定义示例

CodeGen 支持在代码和绑定生成的许多方面进行丰富的自定义。要应用的自定义集将作为 XML 文档传递给 CodeGen,其中包括与模式或模式组件相关的嵌套元素。清单 5 给出了一个简单示例:


清单 5. 简单自定义示例
					
<schema prefer-inline="true" show-schema="false" enumeration-type="simple"
  generate-all="false" includes="order item"/>

清单 5 自定义包含单个无名称空间的模式元素,以及针对特定自定义的几个不同属性(到目前为止,您只是在使用单个模式定义,因此可以使用这种非常简单的自定义形式。稍后在本教程中,您将看到使用多个模式的自定义示例)。第一个自定义属性 — prefer-inline="true" — 将告诉 CodeGen 内联只引用一次的模式定义,而不是执行将其保留为单独类的默认行为。第二个属性 — show-schema="false" — 将阻止在类 Javadoc 中嵌入模式定义。enumeration-type="simple" 将生成简单的类型安全枚举而非 Java 5 枚举。

最后一对属性将一起工作。默认情况下,CodeGen 将为指定为输入的模式中的每个全局类型定义都生成一个单独的顶级类,并且在为每个 complexType 生成的 JiBX 绑定中生成对应的抽象映射。generate-all="false" 属性将更改这种默认行为,只显式地生成特别包括的或引用自 included 类型的那些 complexType。随后,includes="order item" 属性将给出要生成的名称,选择这些名称以保持与测试程序的兼容性 — 需要 <order> 元素,原因是它是实例文档的根元素,并且需要 complexType 项,因为测试程序期望在计算订单总数时找到此类型的独立顶级类。

通过使用 Ant custgen 任务而非 codegen 任务(或者只使用 full 任务,该任务将运行完整的 clean custgen compile bind run 目标序列),您可以尝试这些自定义。清单 6 显示了生成的代码片段,您可以将其与 清单 2 所示的默认生成的代码相比较。除了简化的类 Javadoc 之外,最大的差别是 Customer 类现在是内联的,而 Shipping 类现在是使用自定义的类型安全枚举类的内部类。


清单 6. 用自定义生成的代码
					
/**
 * Order information.
 */
public class Order
{
    private long orderNumber;
    private long customerCustomerNumber;
    private String customerFirstName;
    private String customerLastName;
    private Address billTo;
    private Shipping shipping;
    private Address shipTo;
    private List<Item> itemList = new ArrayList<Item>();
    private Date orderDate;
    private Date shipDate;
    private Float total;
    ...
    /**
     * Supported shipment methods. The "INTERNATIONAL" shipment methods can only be used
       for orders with shipping addresses outside the U.S., and one of these methods is 
       required in this case.
     */
    public static class Shipping
    {
        private final String value;
        public static final Shipping STANDARD_MAIL = new Shipping(
                "STANDARD_MAIL");
        public static final Shipping PRIORITY_MAIL = new Shipping(
                "PRIORITY_MAIL");
        public static final Shipping INTERNATIONAL_MAIL = new Shipping(
                "INTERNATIONAL_MAIL");
        public static final Shipping DOMESTIC_EXPRESS = new Shipping(
                "DOMESTIC_EXPRESS");
        public static final Shipping INTERNATIONAL_EXPRESS = new Shipping(
                "INTERNATIONAL_EXPRESS");
        private static final String[] values = new String[]{"DOMESTIC_EXPRESS",
                "INTERNATIONAL_EXPRESS", "INTERNATIONAL_MAIL", "PRIORITY_MAIL",
                "STANDARD_MAIL"};
        private static final Shipping[] instances = new Shipping[]{
                DOMESTIC_EXPRESS, INTERNATIONAL_EXPRESS, INTERNATIONAL_MAIL,
                PRIORITY_MAIL, STANDARD_MAIL};

        private Shipping(String value) {
            this.value = value;
        }

        public String toString() {
            return value;
        }

        public static Shipping convert(String value) {
            int index = java.util.Arrays.binarySearch(values, value);
            if (index >= 0) {
                return instances[index];
            } else {
                return null;
            }
        }

        public static Shipping fromValue(String text) {
            Shipping value = convert(text);
            if (value == null) {
                throw new IllegalArgumentException("Value \'" + text
                        + "\' is not allowed");
            } else {
                return value;
            }
        }
    }
}

还有许多其他的自定义也可用于 CodeGen。您稍后将在本教程中看到这些自定义的一些示例,但是为了更好地说明这些自定义的强大之处,有必要继续介绍一个更复杂的模式。





回页首



前一页第 5 页,共 14 页后一页
    关于 IBM 隐私条约 联系 IBM 使用条款