在我们的maven项目中,我们有一个包含多个xsd和xjb文件的文件夹。所以我们使用maven-jaxb2-plugin来应用JAXB定制。
目前,我们有两个xjb文件应用于所有xsd 1)GlobalBindings.xjb 2)ServiceSpecific.xjb。 ServiceSpecific.xjb在某些特定元素上更具有更精细的受控绑定。
以下是GlobalBindings.xjb
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings xmlns:jaxb="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:annox="http://annox.dev.java.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
jaxb:version="2.0"
jaxb:extensionBindingPrefixes="xjc annox">
<jaxb:globalBindings>
<xjc:javaType name="java.util.Date" xmlType="xs:dateTime" adapter="company.jaxb.adapter.DateTimeAdapter"/>
</jaxb:globalBindings>
</jaxb:bindings>
使用这种方法,我在生成的对象中的xs:dataTime字段上获得@XmlJavaTypeAdapter(DateTimeAdapter.class)注释。
但是,有一些模式,其JAXB对象需要具有不同版本的DateTimeAdapter.class,比如DateTimeAdapter1.class。
我计划通过将这些特定的xsd分离到一个单独的文件夹并将其与那些特定的xjb配对来实现这一点,xjb通过新的执行步骤在maven插件中提供不同的DateTimeAdapter1。类似下面的内容
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>specific</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory
<bindingDirectory>${basedir}/src/main/resources/xsd</bindingDirectory>
<generatePackage>company.service.generated</generatePackage>
......................
......................
<includeSchemas>
<includeSchema>**/specific.xsd</includeSchema>
</includeSchemas>
但是想知道,如果在servicespecific.xjb中有一个更好的自定义单个模式级别的方法,就不会经历这个麻烦,比如
<jaxb:bindings schemaLocation="specific.xsd" multiple="true">
<jaxb:bindings node="xs:complexType/xs:sequence/xs:element[@type='xs:dateTime']"
multiple="true">
<jaxb:globalBindings>
<xjc:javaType name="java.util.Date" xmlType="xs:dateTime" adapter="company.jaxb.adapter.DateTimeAdapter1"/>
</jaxb:globalBindings>
</jaxb:bindings>
</jaxb:bindings>
我尝试了上述方法,但在生成时,maven失败并显示错误消息
&#34;编译器无法遵守此globalBindings自定义。它附加到错误的地方,或与其他绑定不一致。&#34;
所以,显然我在这里尝试做的不正确。除了pom的变化之外我还有什么选择(即在文件集上使用不同的执行,重新安排XSD需要很多痛苦)
由于
答案 0 :(得分:1)
此处maven-jaxb2-plugin的作者。
我认为没有更好的方法。全球约束是全球性的。因此,如果您希望在不同的模式子集上使用不同的全局绑定,则必须单独编译它们。和你一样。
你不必重新排列模式。您可以配置不同的架构目录或模式或单个文件。