JAXB:bindings.xml中的globalBindings被忽略

时间:2012-02-20 20:08:41

标签: jaxb2

我正在尝试使用JAXB从XML模式生成java文件。模式中的一种数据类型是一个包含大约300个可能值的字符串。由于这大于256,因此默认情况下,xjc不会为此类型生成枚举,而是使用字符串。由于我想生成枚举,因此我使用以下内容创建了bindings.xml:

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb">
  <globalBindings typesafeEnumMaxMembers="1000" />
</bindings>

这不适用于未知原因。 xjc没有给我任何线索。起初我以为我没有包含文件,所以我查了一下。我还试图故意将globalBindings之类的元素名称误导为globalBinding,并发现xjc抱怨了无效元素 - 这显然意味着xjc读取了绑定文件。

但是,当我将globalBindings放在xsd中时,它可以很好地工作 - 生成枚举。

<xs:schema ....>
  <xs:annotation>
    <xs:appinfo>
      <jaxb:globalBindings typesafeEnumMaxMembers="1000" />
    </xs:appinfo>
  </xs:annotation>
...
...
</xs:schema >

所以我的问题是如何在bingings.xml中设置的选项(由xjc读取)不用于自定义编译?我在这里想念什么?

非常感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

我意识到当前目录的长度会导致xjc忽略绑定配置。

执行以下命令失败或成功(与绑定有关),具体取决于项目的基本目录:

xjc -extension  src/main/resources/schema/schema.xsd -b src/main/resources/schema/bindings.xjb  -d target/tmp

因此,项目目录越短,成功的可能性就越小:

FAILS: C:/anydir/tstaaaaaaaaaaaaaaaa/asubdirectory/_this_is_any_project_directory_
FAILS: C:/anydir/tstaaaaaaaa/asubdirectory/_this_is_any_project_directory_
FAILS: C:/anydir/tstaaa/asubdirectory/_this_is_any_project_directory_
FAILS: C:/anydir/tstaa/asubdirectory/_this_is_any_project_directory_
WORKS: C:/anydir/tsta/asubdirectory/_this_is_any_project_directory_
WORKS: C:/anydir/tst/asubdirectory/_this_is_any_project_directory_

我的同事使用类似的环境(也是Windows,相同的JDK,相同的项目源)没有这么严格的长度限制。 所以我不知道导致这种限制的原因。但是在我将项目源位于根目录附近后,它对我有用。

答案 1 :(得分:0)

你需要使用xjb文件而不是xml一个

答案 2 :(得分:0)

我认为你必须在你的标签之前添加一个jaxb注释:

  <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"
      jaxb:extensionBindingPrefixes="xjc"
      jaxb:version="1.0">
        <jaxb:globalBindings typesafeEnumMaxMembers="2000"> 
        </jaxb:globalBindings>
    </jaxb:bindings>

答案 3 :(得分:0)

我确认了Achim Tromm的响应,当前基目录的长度导致xjc忽略绑定配置。缩短文件夹路径构建成功。这是一个JAXB错误!?

答案 4 :(得分:0)

在使用jax-ws尝试通过全局绑定将BigInteger映射到Integer时,我遇到了同样的问题,但是缩短项目路径没有用。解决方案是使用jaxws命名空间特定的父项来嵌入jaxb绑定,如下所示。 (docs

<bindings xmlns="http://java.sun.com/xml/ns/jaxws"
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            version="2.1"
            wsdlLocation="YOURWSDL.wsdl">

<enableWrapperStyle>false</enableWrapperStyle>

<bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='YOURTARGETNAMESPACE']">
    <jaxb:globalBindings>
        ...
    </jaxb:globalBindings>
</bindings>
</bindings>

答案 5 :(得分:0)

我怀疑这仍然会影响许多人,但以防万一:自Maven 3.6.1起,它似乎已得到修复。我们遇到了完全相同的问题,但仅在构建服务器上。原来它仍在运行3.6.0。升级到3.6.0或更高版本可以解决此问题。