如何使用JAXB为不同的模式应用不同的自定义

时间:2015-02-13 13:24:32

标签: jaxb2 maven-jaxb2-plugin

在我们的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需要很多痛苦)

由于

1 个答案:

答案 0 :(得分:1)

此处的作者。

我认为没有更好的方法。全球约束是全球性的。因此,如果您希望在不同的模式子集上使用不同的全局绑定,则必须单独编译它们。和你一样。

你不必重新排列模式。您可以配置不同的架构目录或模式或单个文件。