【问题标题】:JAXB xjc mapping to existing domain objectsJAXB xjc 映射到现有域对象
【发布时间】:2013-05-30 03:47:45
【问题描述】:

我进行了大量搜索,但找不到一个简洁的示例来说明如何将 XML 模式映射到现有域对象,而不是使用 xjc 创建全新的对象。我创建了一个绑定 (xjb) 文件,但仍然找不到完成此操作的方法。

如果我有一个希望 JAXB 使用的现有域对象,如下所示:

package com.blah.domain;
class CustomerOffice{
   private int id;
   private String name;
   private String phone;
}

我有一个如下的 XML 架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:www="http://www.blah.com" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.blah.com" elementFormDefault="unqualified">
   <xs:element name="Customer">
      <xs:complexType>
         <xs:sequence>
           <xs:element name="id" type="xs:int" nillable="false" minOccurs="1" maxOccurs="1"/>
           <xs:element name="name" type="xs:string"/>
           <xs:element name="city" type="xs:string"/>
           <xs:element name="CustomerOffice" type="www:CustomerOffice" maxOccurs="unbounded"/>
        </xs:sequence>
     </xs:complexType>
   </xs:element>
   <xs:complexType name="CustomerOffice">
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="length" type="xs:int"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

如果我用 xjc 生成 JAXB 类,它将创建一个名为 Customer 的新类(这是我想要的)。它还将创建一个名为 CustomerOffice 的新类(我不希望它使用我现有的域对象)。

因此,我希望它使用现有的 com.blah.domain.CustomerOffice,而不是指向“type:www:CustomerOffice”的架构。

我试图让这个尽可能简单的例子,感谢任何帮助。

【问题讨论】:

    标签: xml jaxb schema bind xjc


    【解决方案1】:

    您可以使用外部绑定文件来配置 XJC 以执行您想要的操作。

    <jxb:bindings 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        version="2.1">
    
        <jxb:bindings schemaLocation="yourSchema.xsd">
            <jxb:bindings node="//xs:complexType[@name='CustomerOffice']">
                <jxb:class ref="com.blah.domain.CustomerOffice"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
    

    XJC 通话

    xjc -d outputDir -b binding.xml yourSchema.xsd
    

    【讨论】:

    • 效果很好!非常感谢,希望这能帮助其他一些为此苦苦挣扎的人。
    • xsd里面的complexType还是要定义还是可以去掉?就我而言,当我删除它时,我收到一条错误消息,指出无法引用该类型。虽然我还不完全理解它背后的机制,但我猜想绑定会阻止类的创建? :)
    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多