我正在尝试使用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读取)不用于自定义编译?我在这里想念什么?
非常感谢您的帮助。
答案 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或更高版本可以解决此问题。