You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JAXB与xjc工具问题:含minExclusive约束的xs:decimal解析异常

问题:JAXB xjc处理带minExclusive约束的xs:decimal时生成代码出错

使用JAXB的xjc工具从包含xs:decimal类型且带有minExclusive约束的XSD生成Java代码时,出现两个核心问题:

  1. 生成代码过程中抛出NumberFormatException,工具错误地将小数1.5按整数逻辑解析
  2. 生成的@DecimalMin注解缺少必填的value属性,导致编译报错

简化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  // 错误行:缺少value属性
protected BigDecimal test

错误信息

NumberFormatException堆栈日志

Task :command-xsd:src_frm_xsd
[ant:xjc] java.lang.NumberFormatException: For input string: "1.5"
[ant:xjc] at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
[ant:xjc] at java.lang.Integer.parseInt(Integer.java:580)
[ant:xjc] at java.math.BigInteger.(BigInteger.java:472)
[ant:xjc] at java.math.BigInteger.(BigInteger.java:608)
[ant:xjc] at com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.processType(JaxbValidationsPlugins.java:324)
[ant:xjc] at com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.processElement(JaxbValidationsPlugins.java:219)
[ant:xjc] at com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.processElement(JaxbValidationsPlugins.java:203)
[ant:xjc] at com.sun.tools.xjc.addon.krasa.JaxbValidationsPlugins.run(JaxbValidationsPlugins.java:152)
[ant:xjc] at com.sun.tools.xjc.model.Model.generateCode(Model.java:292)
[ant:xjc] at com.sun.tools.xjc.XJC2Task._doXJC(XJC2Task.java:524)
[ant:xjc] at com.sun.tools.xjc.XJC2Task.doXJC(XJC2Task.java:457)
[ant:xjc] at com.sun.tools.xjc.XJC2Task.execute(XJC2Task.java:380)
[ant:xjc] at com.sun.istack.tools.ProtectedTask.execute(ProtectedTask.java:103)
[ant:xjc] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
[ant:xjc] at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source)
[ant:xjc] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ant:xjc] at java.lang.reflect.Method.invoke(Method.java:498)
[ant:xjc] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
[ant:xjc] at groovy.util.AntBuilder.performTask(AntBuilder.java:333)
[ant:xjc] at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:278)
[ant:xjc] at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:80)
[ant:xjc] at groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:151)
[ant:xjc] at groovy.util.AntBuilder.doInvokeMethod(AntBuilder.java:213)
[ant:xjc] at org.gradle.api.internal.project.ant.BasicAntBuilder.doInvokeMethod(BasicAntBuilder.java:107)
[ant:xjc] at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64)
[ant:xjc] at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:43)
[ant:xjc] at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)

注解编译错误

error: annotation @DecimalMin
is missing a default value for the element 'value'
@DecimalMin
^

解决方案

1. 问题根源

从堆栈日志可以明确,错误来自krasa-jaxb-validation插件——该插件在处理xs:decimal类型的minExclusive约束时,误用了整数解析逻辑处理小数数值,导致抛出异常,同时生成不完整的@DecimalMin注解。

2. 具体解决步骤

方法一:升级krasa-jaxb-validation插件

这是插件的已知bug,升级到2.5及以上版本即可修复。更新后插件会正确识别xs:decimal类型,用BigDecimal解析逻辑处理约束值,生成完整合法的注解:

@XmlElement(required = true)
@NotNull
@DecimalMin(value = "1.5", inclusive = false)
protected BigDecimal test;

方法二:临时禁用该插件

如果暂时无法升级插件,可以在xjc命令中禁用validation插件:

  • Ant任务配置:
    <xjc destdir="src/main/java" schema="schema.xsd">
        <arg value="-nv"/> <!-- 禁用验证插件 -->
    </xjc>
    
  • Gradle插件配置:
    xjc {
        options = ["-nv"]
    }
    
    注意:禁用插件后,XSD中的约束不会自动生成Java验证注解,需要手动补充。

方法三:自定义JAXB绑定文件

如果上述方法都不适用,可通过自定义绑定文件强制指定类型映射逻辑,再手动补充验证注解:
创建bindings.xjb绑定文件:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               version="2.1">
    <jaxb:bindings schemaLocation="schema.xsd">
        <jaxb:bindings node="//xs:element[@name='test']/xs:simpleType">
            <jaxb:property>
                <jaxb:baseType name="java.math.BigDecimal"/>
            </jaxb:property>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

执行xjc命令时引用该绑定文件:

xjc -b bindings.xjb schema.xsd

生成代码后,手动添加正确的验证注解:

@XmlElement(required = true)
@NotNull
@DecimalMin(value = "1.5", inclusive = false)
protected BigDecimal test;

内容的提问来源于stack exchange,提问作者ali raza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:15:03