JAXB问题:nameXmlTransform typeName前缀不起作用

use*_*068 2 java xsd jaxb

我希望将几个模式转换为Java代码.模式都很相似; 例如,每个人都有一个TXLife根对象.如果每个模式生成具有唯一类名的代码,则管理代码会更容易.我可以使用"package"绑定将每个模式的代码放入自己的包中,但是当我尝试使用"prefix"绑定来更改类名时,它会忽略它.

这是我的schema_bindings.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
   <jaxb:bindings schemaLocation="schemas/HI_Request.xsd" node="/xsd:schema">
      <jaxb:schemaBindings>
         <jaxb:package name="com.mycompany.hi"/>
         <jaxb:nameXmlTransform>
            <jaxb:typeName prefix="Hi_"/>
         </jaxb:nameXmlTransform>
      </jaxb:schemaBindings>
   </jaxb:bindings>
</jaxb:bindings> 

当我运行xjc命令时,我得到了(我必须修改xjc.bat文件中的类路径才能使它工作):

C:\ test>\progs\Java\jaxb-ri-2.2.7\bin\xjc.bat -extension -d src -b schema_bindings.xml schemas

parsing a schema...
compiling a schema...
com\mycompany\hi\Holding.java
com\mycompany\hi\InquiryLevel.java
com\mycompany\hi\KeyedValue.java
com\mycompany\hi\OLifE.java
com\mycompany\hi\ObjectFactory.java
com\mycompany\hi\Policy.java
com\mycompany\hi\TXLife.java
com\mycompany\hi\TXLifeRequest.java
com\mycompany\hi\TransMode.java
com\mycompany\hi\TransSubType.java
com\mycompany\hi\TransType.java

我希望的是每个java文件(以及里面的类)都会被命名为"Hi_ <name>".Jaxb似乎完全忽略了我的"前缀"规范.我在绑定文件上尝试了几种变体.我也尝试使用Ant xjc任务进行相同的绑定,所有结果都相同.

我可以使用这些结果,但这意味着处理来自一个模式的输入并将输出生成到另一个模式的代码必须使用完全限定的类名来引用对象,这很尴尬.

bdo*_*han 8

TL; DR

<jaxb:typeName prefix="Hi_"/>对应于从命名复杂类型生成的类.您可以通过添加<jaxb:elementName prefix="Hi_"/>以影响从全局元素生成的类来执行以下操作:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
   <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
      <jaxb:schemaBindings>
         <jaxb:package name="com.mycompany.hi"/>
         <jaxb:nameXmlTransform>
            <jaxb:typeName prefix="Hi_"/>
            <jaxb:elementName prefix="Hi_"/>
         </jaxb:nameXmlTransform>
      </jaxb:schemaBindings>
   </jaxb:bindings>
</jaxb:bindings> 
Run Code Online (Sandbox Code Playgroud)

完整的例子

以下是一个完整的例子.

schema.xsd

下面的模式有一个全局元素和一个命名的复杂类型.

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <element name="GlobalElement">
        <complexType>
            <sequence>
                <element name="foo" type="string"/>
            </sequence>
        </complexType>
    </element>

    <complexType name="NamedComplexType">
        <sequence>
            <element name="bar" type="string" />
        </sequence>
    </complexType>

</schema>
Run Code Online (Sandbox Code Playgroud)

binding.xml

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
   <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
      <jaxb:schemaBindings>
         <jaxb:package name="com.mycompany.hi"/>
         <jaxb:nameXmlTransform>
            <jaxb:typeName prefix="Type_"/>
            <jaxb:elementName prefix="Element_"/>
         </jaxb:nameXmlTransform>
      </jaxb:schemaBindings>
   </jaxb:bindings>
</jaxb:bindings> 
Run Code Online (Sandbox Code Playgroud)

XJC电话

xjc -b binding.xml schema.xsd
Run Code Online (Sandbox Code Playgroud)

产量

我们看到对应于全局元素Element_的类以前缀为前缀,并且与指定的复杂类型对应的类以前缀为前缀Type. ObjectFactory并且package-info不是域模型的一部分,JAXB利用它来获取元数据,因此它们的名称不受影响.

parsing a schema...
compiling a schema...
com/mycompany/hi/Element_GlobalElement.java
com/mycompany/hi/ObjectFactory.java
com/mycompany/hi/Type_NamedComplexType.java
com/mycompany/hi/package-info.java
Run Code Online (Sandbox Code Playgroud)