jaxb2 - 如何使用 JAXB 对不同模式应用不同的自定义

标签 jaxb2 maven-jaxb2-plugin

在我们的 Maven 项目中,我们有一个文件夹,其中包含多个 xsd 和 xjb 文件。因此,我们使用 maven-jaxb2-plugin 应用 JAXB 自定义。

目前,我们有两个 xjb 文件应用于所有 xsd 1)GlobalBindings.xjb 2)ServiceSpecific.xjb。 ServiceSpecific.xjb 更多的是在某些特定元素上进行更精细的控制绑定(bind)。

下面是 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 配对来实现此目的,这通过新的执行步骤在 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>

但是想知道,在不经历这个麻烦的情况下,是否有更好的方法在 servicespec.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 失败并显示错误消息

“编译器无法支持此 globalBindings 自定义。它附加到错误的位置,或者与其他绑定(bind)不一致。”

所以,显然我在这里尝试做的事情是不正确的。除了更改 pom 之外,我还有什么选择(即对一组文件使用不同的执行方式,这需要花费很多时间来重新排列 XSD)

谢谢

最佳答案

的作者在这里。

我认为没有更好的方法了。全局绑定(bind)是全局的。因此,如果您想要不同模式子集上的不同全局绑定(bind),则必须单独编译它们。就像你一样。

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

关于jaxb2 - 如何使用 JAXB 对不同模式应用不同的自定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28500649/

相关文章:

maven-2 - 如何在 maven-jaxb2-plugin 中指定 JAXB 版本?

java - 无法在目标阶段生成 jaxb .xsd 到 java 类

xsd - 创建一个通用的 xsd 生成的类以供其他包使用

java - 您如何自定义 JAXB 生成复数方法名称的方式?

java - jaxb2-maven-plugin 只执行第一次执行

java - 如何使用带有内联 XSD 的 jaxb2 maven 插件?

java - 如何使用 jvnet maven-jaxb2-plugin 从类生成 XSD

java - JAXB 错误 : has more than one mapping. 由于两个对象工厂具有相同的 Bean

java - Jaxb:使用正在编码的类中包含的不同根元素生成 XML?

xml - 如何在解码期间使用 JAXB XmlAdapter 处理 XML IDREF 的前向引用?