2

我正在从 PeopleSoft 提供的 WSDL 生成自定义 Java 代码。我编写了几个 XJC 插件来尝试清理生成的代码以便更易于使用——添加接口和自定义方法等。

但是,我想为生成的异常类添加一个通用接口,但在我的插件中,这些类似乎不存在。

生成的异常类如下所示:

public class M286565V1 extends Exception

它们都具有相同的命名模式(M 后跟一串数字,以 V1 结尾)并且它们都扩展了 java.lang.Exception。但是,它们都有一个通用方法,getFaultInfo()我想将其添加到接口中。

在我的插件中,我遍历所有提供的类,Outline.getClasses()并检查每个类是否扩展了 java.lang.Exception。

for ( ClassOutline classOutline : outline.getClasses() ) {
    final JDefinedClass implClass = classOutline.implClass;

    JClass superClass = implClass._extends();
    if ( superClass != null && superClass.fullName().equals( "java.lang.Exception" ) ) {
        //This class is an Exception class
    }
}

这无法找到任何异常类。

我也尝试过按名称匹配:

for ( ClassOutline classOutline : outline.getClasses() ) {
    final JDefinedClass implClass = classOutline.implClass;

    //Try to capture exception classes by name
    //Exception classes start with an M, followed by a number
    final String className = implClass.name();
    LOG.debug( "Checking class {}", className );
    if ( className.startsWith( "M" ) && Character.isDigit( className.charAt( 1 ) ) ) {
        //This class is an Exception class
    }
}

这也会失败,并且日志消息(“正在检查类...”)不会打印最终生成的任何异常类。

我还尝试将此代码从run()方法中移出并移到postProcessModel()我的插件的方法中,希望稍后在该过程中执行的代码会有所帮助。这也失败了。

代码按预期执行,所以我确信我的插件配置是正确的。此外,我以同样的方式捕获和修改了其他类。在运行时模型中似乎没有任何异常。但是,每次都会正确生成异常类。

有没有办法在运行时从 XJC 插件中捕获这些类?

提前感谢您提供的任何帮助。

4

1 回答 1

1

考虑为该任务使用JAXB2 Basics Inheritance 插件。(免责声明:我是作者。)

您实际上应该在run插件的方法中获取类。位置不对,postProcessModell太早了,在模型加载后调用它进行后处理。

我只是建议调试它。您可以从测试用例中执行 XJC 而不会出现大问题,例如看这个测试:

https://github.com/highsource/jsonix-schema-compiler/blob/master/compiler/src/test/java/org/hisrc/jsonix/xjc/plugin/tests/JsonixPluginTest.java

希望这可以帮助。

于 2015-03-24T12:56:28.407 回答