JAXB binding file: XmlAdapters and package name
For Apache CXF users, the cleanest way is to use the -p
option offered by wsdl2java
.
-p [wsdl-namespace=]PackageName
Specifies zero, or more, package names to use for the generated code. Optionally specifies the WSDL namespace to package name mapping.
In our case
-p http://www.w3.org/2001/XMLSchema=org.acme.foo
If you use the cxf-codegen-plugin, then just add another pair of <extraarg>
.
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
[...]
<extraarg>-p</extraarg>
<extraarg>http://www.w3.org/2001/XMLSchema=org.acme.foo</extraarg>
[...]
</plugin>
No need for a targetNamespace pointing at the reserved XSD namespace and no need for catch-all jaxb package binding.
The org.w3._2001.xmlschema
package is created here because XJC has to generate a class that extends javax.xml.bind.annotation.adapters.XmlAdapter
, which in turn calls your parse/print static methods. For some reason, it puts them into this package, rather than somewhere more useful.
You haven't said which JAXB implementation you use, but the JAXB RI has an extension to the javaType
binding customization which allows you to specify a subclass of XmlAdapter
directly, rather than parseMethod
/printMethod
pairs. This removes the need to generate the synthetic XmlAdapter
bridge class. See the RI docs for how to do this.
I imagine EclipseLink/Moxy has something similar to this, but I'm not sure if the XJC that ships with Java6 is capable of it (Sun seems to have removed half of the useful stuff from the RI when they brought it into the JRE).