I'm generating JAXB classes from an xsd at runtime using XJC. But by default the maxLength
restriction in the xsd isn't annotated.
I found a plugin to deal with this, krasa-jaxb-tools. I've added the dependencies to my POM, but I can't seem to add the plugin to the XJC process.
I'm using version 2.2.11 of the jaxb-xjc tools. Here are my dependencies:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-xjc</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-jxc</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.github.krasa</groupId>
<artifactId>krasa-jaxb-tools</artifactId>
<version>1.3</version>
</dependency>
I'm trying to instantiate the plugin, configuring it and passing it to the generateCode(Plugins[] extensions, ErrorListener errorListener)
method on my S2JJAXBModel
model, but it doesn't seem to have any effect. Here's my code:
SchemaCompiler schemaCompiler = XJC.createSchemaCompiler();
schemaCompiler.forcePackageName(packageRoot);
// JAXB Plugin used to get the proper @Size annotations on all fields.
JaxbValidationsPlugins jaxbValidationPlugin = new JaxbValidationsPlugins();
// Build up list of options for the plugin.
// First option must be the name of the plugin itself.
// Options must be prefixed with dashes
String[] args = new String[] { "-" + JaxbValidationsPlugins.PLUGIN_OPTION_NAME };
try {
// Activate plugin
jaxbValidationPlugin.parseArgument(new Options(), args, 0);
} catch (BadCommandLineException | IOException e1) {
e1.printStackTrace();
}
InputSource inputSource = new InputSource(schemaFile.toURI().toString());
schemaCompiler.parseSchema(inputSource);
S2JJAXBModel model = schemaCompiler.bind();
// Passing the plugin to the method
JCodeModel jCodeModel = model.generateCode(new Plugin[] {jaxbValidationPlugin}, null);
What am I doing wrong?
Here's how the actual implementation of the
#generateCode()
method looks in version 2.2.11As you can see, the params are just swallowed.
To add the plugin, you want to access the
Options
found in theSchemaCompiler
and add your plugin there. Note also that theparseArgument()
call should be made on the options, not the plugin.Here's how you accomplish that: