It seems there was once a plugin JAXB's xjc called inject-listener-code which added PropertyChangeListener functionality to the generated classes (referenced here, for example: http://ift.tt/1yTXdsq)
However, according to the JAXB-RI website, this plugin is deprecated and no longer supported. I tried using the listed Enhanced Property Listener Injection plugin but I could not get it working (see below) and I am not sure whether it is compatible with current Java/JAXB versions anyway (and whether it would inject GPL-licensed code into the generated classes which would not be ok).
Is there any other way to add PropertyChangeListener support to the generated classes?
I am using Java 8 Update 20.
Details of trying to run xjc: I tried using JAXB packaged with Java 8 as well as standalone JAXB 2.2.11 and 2.1.13 (since JAXB 2.2.x seems to have dropped com.sun.tools.xjc.outline.Aspect which is required by both plugins):
Command-line:
xjc foobar.xsd -classpath "xalan-j/xalan.jar;proplistinjector-0.2.2.jar" -Xinject-prop-listeners -no-coll-listeners
with 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)
After adding extending the classpath with 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)
with 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
No comments:
Post a Comment