JAXB:如何向使用 xjc 生成的类添加 PropertyChangeListener 支持

问题描述 投票:0回答:1

似乎曾经有一个 JAXB 的

xjc
名为
inject-listener-code
的插件,它向生成的类添加了
PropertyChangeListener
功能(此处引用,例如:http://hwellmann.blogspot.de/2010/05/java- xml-binding-with-property-change.html)

但是,根据 JAXB-RI 网站,该插件已被弃用并且不再受支持。我尝试使用列出的 Enhanced Property Listener Injection 插件 但我无法让它工作(见下文),并且我不确定它是否与当前的 Java/JAXB 版本兼容(以及它是否会将 GPL 许可的代码注入到生成的类是不行的)。

还有其他方法可以为生成的类添加

PropertyChangeListener
支持吗?

我正在使用 Java 8 Update 20。

尝试运行的详细信息

xjc
我尝试使用与Java 8一起打包的JAXB以及独立的JAXB 2.2.11和2.1.13(因为JAXB 2.2.x似乎已经删除了两者都需要的
com.sun.tools.xjc.outline.Aspect
)插件):

命令行:

xjc foobar.xsd -classpath "xalan-j/xalan.jar;proplistinjector-0.2.2.jar" -Xinject-prop-listeners -no-coll-listeners

使用 JAXB 2.1.13

Exception in thread "main" javax.xml.transform.TransformerFactoryConfigurationEr   ror: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
    at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)

添加使用 Xalan 扩展类路径后:

Exception in thread "main" java.lang.NoSuchMethodError:
com.sun.tools.xjc.model.nav.NType.toType(Lcom/sun/tools/xjc/outline/Outline;Lcom/sun/tools/xjc/outline/Aspect;)Lcom/sun/codemodel/JType;
    at org.no0ne.jaxbworks.proplistinjector.AbstractField$1TypeList.add(AbstractField.java:509)
    at org.no0ne.jaxbworks.proplistinjector.AbstractField$1TypeList.add(AbstractField.java:521)
    at org.no0ne.jaxbworks.proplistinjector.AbstractField.getType(AbstractField.java:525)
    at org.no0ne.jaxbworks.proplistinjector.AbstractField.<init>(AbstractField.java:152)
    at org.no0ne.jaxbworks.proplistinjector.AbstractListField.<init>(AbstractListField.java:118)
    at org.no0ne.jaxbworks.proplistinjector.UntypedListField.<init>(UntypedListField.java:118)
    at org.no0ne.jaxbworks.proplistinjector.UntypedListFieldRenderer.generate(UntypedListFieldRenderer.java:73)
    at org.no0ne.jaxbworks.proplistinjector.DefaultFieldRenderer.generate(DefaultFieldRenderer.java:92)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.generateFieldDecl(BeanGenerator.java:777)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.generateClassBody(BeanGenerator.java:558)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:261)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:169)
    at com.sun.tools.xjc.model.Model.generateCode(Model.java:288)
    at com.sun.tools.xjc.Driver.run(Driver.java:384)
    at com.sun.tools.xjc.Driver.run(Driver.java:221)
    at com.sun.tools.xjc.Driver._main(Driver.java:144)
    at com.sun.tools.xjc.Driver.access$000(Driver.java:82)
    at com.sun.tools.xjc.Driver$1.run(Driver.java:103)

使用 JAXB 2.2.11:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/xjc/outline/Aspect
    at org.no0ne.jaxbworks.proplistinjector.AbstractField.<init>(AbstractField.java:152)
    at org.no0ne.jaxbworks.proplistinjector.AbstractListField.<init>(AbstractListField.java:118)
    at org.no0ne.jaxbworks.proplistinjector.UntypedListField.<init>(UntypedListField.java:118)
    at org.no0ne.jaxbworks.proplistinjector.UntypedListFieldRenderer.generate(UntypedListFieldRenderer.java:73)
    at org.no0ne.jaxbworks.proplistinjector.DefaultFieldRenderer.generate(DefaultFieldRenderer.java:92)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.generateFieldDecl(BeanGenerator.java:777)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.generateClassBody(BeanGenerator.java:558)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:261)
    at com.sun.tools.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:169)
    at com.sun.tools.xjc.model.Model.generateCode(Model.java:288)
    at com.sun.tools.xjc.Driver.run(Driver.java:384)
    at com.sun.tools.xjc.Driver.run(Driver.java:221)
    at com.sun.tools.xjc.Driver._main(Driver.java:144)
    at com.sun.tools.xjc.Driver.access$000(Driver.java:82)
    at com.sun.tools.xjc.Driver$1.run(Driver.java:103)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.xjc.outline.Aspect
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 15 more
java xml jaxb
1个回答
0
投票

A PropertyListenerPlugin 可从 HiSrc BasicJAXB Plugins 获得。该插件可以生成绑定和/或约束(可否决)PropertyChangeEvents,请参阅JavaDoc

免责声明:我是HiSrc BasicJAXB项目的维护者。

© www.soinside.com 2019 - 2024. All rights reserved.