如何在运行时以编程方式添加 xjc 插件? [英] How do I add an xjc plugin programmatically at runtime?

查看:24
本文介绍了如何在运行时以编程方式添加 xjc 插件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在运行时使用 XJC 从 xsd 生成 JAXB 类.但默认情况下,xsd 中的 maxLength 限制没有被注释.

I'm generating JAXB classes from an xsd at runtime using XJC. But by default the maxLength restriction in the xsd isn't annotated.

我找到了一个插件来解决这个问题,krasa-jaxb-tools.我已经在我的 POM 中添加了依赖项,但我似乎无法将插件添加到 XJC 进程中.

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.

我正在使用 jaxb-xjc 工具的 2.2.11 版.这是我的依赖项:

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>

我正在尝试实例化插件,配置它并将其传递给我的 S2JJAXBModel 模型上的 generateCode(Plugins[] extensions, ErrorListener errorListener) 方法,但是它似乎没有任何效果.这是我的代码:

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);

我做错了什么?

推荐答案

以下是 #generateCode() 方法在 2.2.11 版本中的实际实现方式

Here's how the actual implementation of the #generateCode() method looks in version 2.2.11

// com.sun.tools.xjc.api.impl.s2j.JAXBModelImpl.java

public JCodeModel generateCode(Plugin[] extensions,ErrorListener errorListener) {
    // we no longer do any code generation
    return outline.getCodeModel();
}

如你所见,参数被吞掉了.

As you can see, the params are just swallowed.

要添加插件,您需要访问 SchemaCompiler 中的 Options 并在那里添加您的插件.另请注意,parseArgument() 调用应该在选项上进行,而不是在插件上进行.

To add the plugin, you want to access the Options found in the SchemaCompiler and add your plugin there. Note also that the parseArgument() call should be made on the options, not the plugin.

以下是您如何做到这一点:

Here's how you accomplish that:

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 };

// Get the options for the schema compiler, this is where we add plugins.
Options schemaCompilerOptions = ((SchemaCompilerImpl) schemaCompiler).getOptions();
schemaCompilerOptions.getAllPlugins().add(jaxbValidationPlugin);

// Call the parseArgument method on the options, not the plugin
// Passing in zero because we want to parse the first argument in the array
try {
    schemaCompilerOptions.parseArgument(args, 0);
} catch (BadCommandLineException e1) {
    e1.printStackTrace();
}

InputSource inputSource = new InputSource(schemaFile.toURI().toString());
schemaCompiler.parseSchema(inputSource);
S2JJAXBModel model = schemaCompiler.bind();

JCodeModel jCodeModel = model.generateCode(null, null);

这篇关于如何在运行时以编程方式添加 xjc 插件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆