在从 XML 模式 (XSD) 生成 Java 代码时,我遇到了 JAXB 和 xjc 的问题,该模式包含带有 minExclusive 约束的 xs:decimal 元素。尽管在我的 XSD 中将类型指定为 xs:decimal,但 xjc 正在生成尝试将值解析为整数的代码,从而导致 NumberFormatException。
这是我的 XSD 的简化版本:
<xs:element name="test">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:minExclusive value="1.5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
正在生成的代码
@XmlElement(required = true)
@NotNull
@DecimalMin <- error occurs on this line
protected BigDecimal test
错误
任务:命令-xsd:src_frm_xsd
[ant:xjc] java.lang.NumberFormatException: 对于输入字符串:“1.5”
[ant:xjc] 在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) [ant:xjc] 在 java.lang.Integer.parseInt(Integer.java:580)
[ant:xjc] 在 java.math.BigInteger.(BigInteger.java:472) [ant:xjc] 在 java.math.BigInteger. (BigInteger.java:608) [ant:xjc] 位于 com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.processType(JaxbValidationsPlugins.java:324) [ant:xjc] 位于 com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.processElement(JaxbValidationsPlugins.java:219) [ant:xjc] 位于 com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.processElement(JaxbValidationsPlugins.java:203) [ant:xjc] 位于 com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.run(JaxbValidationsPlugins.java:152) [ant:xjc] 位于 com.sun.tools.xjc.model.Model.generateCode(Model.java:292) [ant:xjc] 位于 com.sun.tools.xjc.XJC2Task._doXJC(XJC2Task.java:524) [ant:xjc] 位于 com.sun.tools.xjc.XJC2Task.doXJC(XJC2Task.java:457) [ant:xjc] 位于 com.sun.tools.xjc.XJC2Task.execute(XJC2Task.java:380) [ant:xjc] 位于 com.sun.istack.tools.ProtectedTask.execute(ProtectedTask.java:103) [ant:xjc] 位于 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) [ant:xjc] 位于 sun.reflect.GenerateMethodAccessor88.invoke(来源未知) [ant:xjc] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [ant:xjc] 在 java.lang.reflect.Method.invoke(Method.java:498) [ant:xjc] 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99) [ant:xjc] 在 groovy.util.AntBuilder.performTask(AntBuilder.java:333) [ant:xjc] 在 groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:278) [ant:xjc] 在 org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:80) [ant:xjc] 在 groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:151) [ant:xjc] 在 groovy.util.AntBuilder.doInvokeMethod(AntBuilder.java:213) [ant:xjc] 位于 org.gradle.api.internal.project.ant.BasicAntBuilder.doInvokeMethod(BasicAntBuilder.java:107) [ant:xjc] 在 groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64) [ant:xjc] 在 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:43) [ant:xjc] 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
错误:注释@DecimalMin
缺少元素“value”的默认值
@DecimalMin
^
生成的代码尝试将值解析为整数,导致 NumberFormatException。
我尝试添加自定义 JAXB 绑定,但问题仍然存在。如何确保 xjc 正确生成处理 xs:decimal 的代码,其中 minExclusive 作为 BigDecimal 而不是整数?
任何见解或建议将不胜感激。谢谢!
在构建 UI 项目时,我们从 XML 模式生成 Java 类,期望它将 XML 类型正确映射到相应的 Java 类型。然而,在这种情况下,它似乎生成了错误的代码,试图将 XML 值解析为整数而不是小数,从而导致错误并无法生成正确的注释。要修复问题
XJsr303Annotations
选项允许生成带有注释的Java类。
要添加正确的注释
@DecimalMax
和 @DecimalMin
和 maxExculsive
我们必须添加 minExculsive
-XJsr303Annotations:JSR_349=true