Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
440 views
in Technique[技术] by (71.8m points)

java - Issue with JAXB: nameXmlTransform typeName prefix not working

I wish to convert several schemas into Java Code. The schemas are all similar; for example, each one has a TXLife root object. It would be easier to manage the code if each schema generated code with unique class-names. I can use the "package" binding to put the code from each schema into its own package, but when I try to use the "prefix" binding to change the class names, it ignores it.

Here is my schema_bindings.xml file:

<?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> 

When I run the xjc command I get (I had to modify the classpath inside the xjc.bat file in order to get it to work):

C:est>progsJavajaxb-ri-2.2.7inxjc.bat -extension -d src -b schema_bindings.xml schemas

parsing a schema...
compiling a schema...
commycompanyhiHolding.java
commycompanyhiInquiryLevel.java
commycompanyhiKeyedValue.java
commycompanyhiOLifE.java
commycompanyhiObjectFactory.java
commycompanyhiPolicy.java
commycompanyhiTXLife.java
commycompanyhiTXLifeRequest.java
commycompanyhiTransMode.java
commycompanyhiTransSubType.java
commycompanyhiTransType.java

What I was hoping for is that each java file (and the class inside) would be named "Hi_<name>". Jaxb seems to be completely ignoring my "prefix" specification. I have tried several variations on the bindings file. I have also tried the same bindings using the Ant xjc task, all with the same results.

I can work with these results, but it would mean that code that processes input from one schema and produces output to another schema would have to use fully-qualified class names to refer to the objects, which is awkward.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

TL;DR

<jaxb:typeName prefix="Hi_"/> corresponds to the classes generated from named complex types. You could do the following by adding <jaxb:elementName prefix="Hi_"/> to affect the classes generated from global elements:

<?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> 

Full Example

Below is a complete example.

schema.xsd

The schema below has a global element and a named complex type.

<?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>

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> 

XJC Call

xjc -b binding.xml schema.xsd

Output

We see that the class corresponding to the global element was prefixed with Element_ and the class corresponding to the named complex type was prefixed with Type. ObjectFactory and package-info are not part of the domain model and are leveraged by JAXB for metadata so their names were not affected.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...