我目前使用JAXB以和解组XML生成Java类。 现在,我想创建一个新的模式非常相似,第一和具有所生成的类实现相同的接口。
比方说,我有一个定义XML类似代码的两条架构文件:
adult.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="Job" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
kid.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="School" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
使用JAXB和XJC我想生成两个类文件:
public class Adult implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getJob { ... }
}
public class Kid implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getSchool { ... }
}
该人接口定义getName()
和getAge()
方法。
我已经看了一些的文件映射接口,但是这似乎仅是这种情况,当你已经有要映射到DOM Java类。
此外,我试图用这个外部插件 ,但它似乎并没有工作。 这是我的XJB绑定文件:
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:ext="http://xml.w-wins.com/xjc-plugins/interfaces"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="xsd/adult.xsd" node="xs:schema/xs:complexType[@name='Person']">
<ext:interface>mypackage.Hello</ext:interface>
</jxb:bindings>
</jxb:bindings>
但是这提供了以下错误:
$ java -cp "lib/activation.jar;lib/InterfacesXJCPlugin.jar;lib/jaxb1-impl.jar;lib/jaxb-api.jar;lib/jaxb-xjc.jar;lib/jsr173_1.0_api.jar" com.sun.tools.xjc.XJCFacade -p mypackage.myxml -extension -Xinterfaces xsd/adult.xsd -b binding.xjb
parsing a schema...
[ERROR] XPath evaluation of "xs:schema/xs:complexType[@name='Person']" results in empty target node
line 8 of file:/C:/dev/jaxb/jaxb-ri/binding.xjb
Failed to parse a schema.
是否有可能生成JAXB类实现接口?
更新
我已经使用试过接口插入插件,但由于某种原因不能得到它的工作。 这是我如何打电话XJC但它是因为如果该插件罐子是没有得到从classpath回升:
$ java -cp "lib/xjc-if-ins.jar;lib/jaxb-xjc.jar" com.sun.tools.xjc.XJCFacade -p mypackage -extension -Xifins myschema.xsd -b binding.xjb
我得到的错误:
unrecognized parameter -Xifins
有任何想法吗?
Answer 1:
不幸的是,它看起来像在一些其他的答案中提到的界面注入插件不再是很好的支持。 事实上,我无法找到下载的JAR。
幸运的是, JAXB2基础插件提供用于添加到所生成的JAXB存根(见的接口类似的机制继承插件 )。
继承的插件文档具有显示XML schema文件可能是什么样子的例子。 但是,因为你不能修改架构,您可以使用外部绑定文件,而不是:
<?xml version="1.0"?>
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="xsd/adult.xsd">
<jxb:bindings node="//xs:complexType[@name='Person']">
<inheritance:implements>mypackage.Hello</inheritance:implements>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
该JAXB2基础插件文件包括使用与Ant和Maven插件的说明。 你也可以用它直接在命令行,但命令是有点乱(因为你要添加到类路径罐子数):
java -jar jaxb-xjc.jar
-classpath jaxb2-basics-0.5.3.jar,jaxb2-basics-runtime-0.5.3.jar,
jaxb2-basics-tools-0.5.3.jar,commons-beanutils-0.5.3.jar,
commons-lang.jar,commons-logging.jar
-p mypackage.myxml -extension -Xinheritance xsd/adult.xsd -b binding.xjb
该JAXB2基础插件提供了许多其他工具,你也可能会发现有用(如平等,的hashCode和toString方法自动生成)。
Answer 2:
这可能是矫枉过正您的具体情况,但我已经使用AspectJ这样做(我们已经使用上的项目方面,所以我们已经有了依赖性和曝光)。
你会宣称线沿线的一个方面:
public aspect MyAspect
{
declare parents:
com.foo.generated.Adult
implements com.foo.Person;
declare parents:
com.foo.generated.Kid
implements com.foo.Person;
}
这将接口加入com.foo.Person
的类com.foo.generated.Adult
和com.foo.generated.Adult
可能是矫枉过正你的目的,但它为我们工作。
Answer 3:
为我工作的答案是使用JAXB2基础插件的吉姆Hurne的例子。 但他链接的文档似乎不再那么参考,我这是怎么配置的Maven插件:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-Xinheritance</arg>
</args>
<bindingDirectory>src/main/resources/xjb</bindingDirectory>
<bindingIncludes>
<include>**.xml</include> <!-- This Should reference the binding files you use to configure the inheritance -->
</bindingIncludes>
<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<generateDirectory>${project.build.directory}/generated-sources/jaxb</generateDirectory>
<generatePackage>mypackage</generatePackage>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.5.3</version>
</plugin>
</plugins>
</configuration>
</plugin>
Answer 4:
这是可能实现这一目标对于这个简单的情况下,不使用使用第三方插件JAXB RI供应商扩展 XJC:超接口定制。 应该指出这种做法将导致所有生成的类来实现的接口。
例如绑定文件:
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="adult.xsd" node="/xs:schema">
<jxb:globalBindings>
<xjc:superInterface name="com.example.model.Person"/>
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
然后,您只需要运行XJC指定绑定文件和设置-extension标志。 更快/比带来JAXB2Basics简单!
我最初怀疑这会工作作为文档状态:
定制允许您指定的Java接口将被用作所有生成的接口的根接口的全名。 这种定制没有影响,除非你特别生成与所述globalBindings generateValueClass =“假”开关接口。
但是,当我尝试过了类似上面的一个绑定(不指定generateValueClass =“假”,并生成类,而不是接口),它给了我所需要的输出 - 我所有生成的类实现的公共接口。
Answer 5:
在我的情况下通过java命令行调用-jar工作:
java -jar $somepath/jaxb-xjc.jar -classpath $somepath/xjc-if-ins.jar my.xsd -d $destdir -b $bindingconfig -p $desiredpackage -extension -Xifins
然而执行XJC蚂蚁任务的错误仍然时。 给出的错误消息刺激在我的情况下,真正的原因是在一个类文件蚂蚁坏的版本号尝试加载(见下面的堆栈跟踪)。 :只有当您添加以下ANT_OPTS出现此错误信息是否正确-Dcom.sun.tools.xjc.Options.findServices=true
[xjc] java.lang.UnsupportedClassVersionError: Bad version number in .class file
[xjc] at java.lang.ClassLoader.defineClass1(Native Method)
[xjc] at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
[xjc] at org.apache.tools.ant.AntClassLoader.defineClassFromData(AntClassLoader.java:1134)
[xjc] at org.apache.tools.ant.AntClassLoader.getClassFromStream(AntClassLoader.java:1320)
[xjc] at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1376)
[xjc] at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1336)
[xjc] at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1074)
[xjc] at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
[xjc] at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
[xjc] at com.sun.tools.xjc.Options.findServices(Options.java:936)
[xjc] at com.sun.tools.xjc.Options.getAllPlugins(Options.java:336)
[xjc] at com.sun.tools.xjc.Options.parseArgument(Options.java:632)
[xjc] at com.sun.tools.xjc.Options.parseArguments(Options.java:742)
[xjc] at com.sun.tools.xjc.XJC2Task._doXJC(XJC2Task.java:444)
[xjc] at com.sun.tools.xjc.XJC2Task.doXJC(XJC2Task.java:434)
[xjc] at com.sun.tools.xjc.XJC2Task.execute(XJC2Task.java:369)
[xjc] at com.sun.istack.tools.ProtectedTask.execute(ProtectedTask.java:55)
[xjc] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[xjc] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[xjc] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[xjc] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[xjc] at java.lang.reflect.Method.invoke(Method.java:585)
[xjc] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[xjc] at org.apache.tools.ant.Task.perform(Task.java:348)
[xjc] at org.apache.tools.ant.Target.execute(Target.java:390)
[xjc] at org.apache.tools.ant.Target.performTasks(Target.java:411)
[xjc] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360)
[xjc] at org.apache.tools.ant.Project.executeTarget(Project.java:1329)
[xjc] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[xjc] at org.apache.tools.ant.Project.executeTargets(Project.java:1212)
[xjc] at org.apache.tools.ant.Main.runBuild(Main.java:801)
[xjc] at org.apache.tools.ant.Main.startAnt(Main.java:218)
[xjc] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[xjc] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
[xjc]
[xjc] failure in the XJC task. Use the Ant -verbose switch for more details
Answer 6:
为接口插入插件文档建议了下面的
[要通过来自命令行界面插入插件调用XJC,可以写为:
java -cp $JAXB_HOME/share/lib/xjc-if-ins.jar -extension -Xifins schema
]
我猜测,你所呼叫的错误类的主要方法 - com.sun.tools.xjc.XJCFacade。 你应该用准确的语法重试。
这里是另一个论坛。它讨论了类似的问题的链接。 http://forums.java.net/jive/message.jspa?messageID=220686
- 我会公布这是一个评论,但我没有足够的积分发表评论。
Answer 7:
如果你提取类型分为导入adult.xsd和kid.xsd一个共同的XSD? 或者你有一个现有的接口,你需要它们来实现?
Answer 8:
对于那些谁愿意帮助建设JAXB数据绑定文件进行更复杂的架构 - 最新的开源XML工具 - CAM编辑器V2.2现在支持这一点。
您可以访问的资源和下载站点逐步引导和看下载部分页面顶部的工具。
http://www.cameditor.org/#JAXB_Bindings
请享用。
Answer 9:
一些描述的XJC plygin是回答你的问题,它只是一个找到一个工作的问题。 对他们来说,最好的来源是在这里:
https://jaxb2-commons.dev.java.net/
尤其是,这一个:
https://jaxb2-commons.dev.java.net/interface-insertion/
文章来源: Generating a JAXB class that implements an interface