How can I get JAXB2 to emit CamelCase bindings?

2020-04-05 07:54发布

问题:

I'm generating Java classes from a WSDL using the jaxws-maven-plugin's wsimport goal. Out of the box, this generates hideous classes and methods from the XML schema; e.g., a class called MYOBJECT from an XML element named MY_OBJECT.

I've found that I can customize my JAXB2 bindings with an external file; this would be acceptable for a small number of classes and methods, but the overhead of manually naming everything in this case is undesirable.

Some searching uncovers references to an XJC CamelCase Always plugin, but this appears to be unmaintained and most links are 404s. Not willing to give up, I did find a camelcase-always Maven artifact which appears to provide this functionality, but I'm not sure how to configure this so that jaxws-maven-plugin uses it.

How can I get CamelCase bindings without specifying them all manually?

回答1:

I didn't find examples of how to do this with jaxws-maven-plugin, but I did find examples using the maven-jaxb2-plugin.

First, you need a repository added to your POM:

<repository>
    <id>releases</id>
    <name>Releases</name>
    <url>https://oss.sonatype.org/content/repositories/releases</url>
</repository>

Note the plugin declaration and arguments added to the maven-jaxb2-plugin execution.

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.0</version>
    <executions>
        <execution>
            <id>jaxb-generate</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <generatePackage>YOUR.PACKAGE.HERE</generatePackage>
        <args>
            <arg>-camelcase-always</arg>
        </args>
        <bindingDirectory>src/main/binding</bindingDirectory>
        <schemas>
            <schema>
                <url>http://YOUR.WSDL.HERE</url>
            </schema>
        </schemas>
        <extension>true</extension>
        <plugins>
            <plugin>
                <groupId>org.andromda.thirdparty.jaxb2_commons</groupId>
                <artifactId>camelcase-always</artifactId>
                <version>1.0</version>
            </plugin>
        </plugins>
    </configuration>
</plugin>

See the docs for more details.



回答2:

Might be useful for users of Apache CXF and the cxf-xjc-plugin.

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-xjc-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
      <extensions>
        <extension>org.andromda.thirdparty.jaxb2_commons:camelcase-always:1.0</extension>
      </extensions>
    </configuration>
    <executions>
      <execution>
        <id>generate-sources</id>
        <phase>generate-sources</phase>
        <goals>
          <goal>xsdtojava</goal>
        </goals>
        <configuration>
          <sourceRoot>${basedir}/target/generated-sources/cxf</sourceRoot>
          <xsdOptions>
            <xsdOption>
              <xsd>YOUR.XSD.HERE</xsd>
              <packagename>YOUR.PACKAGE.HERE</packagename>
              <extensionArgs>
                <extensionArg>-camelcase-always</extensionArg>
              </extensionArgs>
              <extension>true</extension>
            </xsdOption>
          </xsdOptions>
        </configuration>
      </execution>
    </executions>
  </plugin>