我是JAXB的初学者,在使用xjc生成Java类时遇到了烦人的问题。我提供了这样的XSD:
<xs:element name="item" type="itemType"/>
...
<xs:complexType name="itemType">
<xs:attribute name="id" type="xs:string" use="required">
...
</xs:complexType>
和xjc正在生成一个名为ItemType.java
的类,但我希望名称为Item.java
。也就是说,我希望生成的类就好像XSD是这样的:
<xs:element name="item">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required">
...
</xs:complexType>
</xs:element>
任何其他元素都不会重复使用itemType,只是构建XSD的人喜欢这样。 我想可能有一种方法可以使用自定义绑定,但我仍然没有找到如何。
任何帮助?
谢谢, 米格尔
答案 0 :(得分:65)
JAXB提供了两种方法来实现这一目标:
<强> 1。内联架构Anntotations
您可以使用JAXB架构注释来控制类名。
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.1">
<xs:complexType name="itemType">
<xs:annotation>
<xs:appinfo>
<jaxb:class name="Item"/>
</xs:appinfo>
</xs:annotation>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
<强> 2。外部绑定文件
此自定义也可以通过外部绑定文件完成:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jxb:bindings schemaLocation="your-schema.xsd">
<jxb:bindings node="//xs:complexType[@name='itemType']">
<jxb:class name="Item"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
xjc命令行将是:
xjc -d out -b binding.xml your-schema.xsd
答案 1 :(得分:16)
好吧,我终于找到了怎么做。我的外部绑定文件是:
<?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"
jxb:extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
</jxb:bindings>
必须使用xjc
选项执行和-extension
命令。
我在此页面找到了解决方案:
http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html(编辑:过时的链接)
此致 米格尔
答案 2 :(得分:1)
这是我用来重命名复杂类型的外部绑定文件。使用cxf的wsdl2java编译。
<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[1]">
<jxb:bindings node="//xs:complexType[@name='VatNumber_exception']">
<jxb:class name="VatNumException"/>
</jxb:bindings>
</jaxws:bindings>
</jaxws:bindings>