XSD生成Java类时double字段未添加@XmlElement(required=true)注解
问题根本原因
JAXB的XJC代码生成工具默认对Java基本数据类型(比如double、int、long等)做了特殊处理:由于基本类型本身有默认初始值(double默认值为0.0),即使XSD中配置了minOccurs="1",XJC也会判定该字段不可能为null,因此不会自动添加@XmlElement(required = true)注解。而引用类型(比如String、BigDecimal)没有默认值,就会正常生成必填注解。
可用解决方案
方案1:使用JAXB2 Annotate插件强制加注解(最符合保留double类型的需求)
你可以通过JAXB的自定义绑定规则,强制给salary字段添加要求的注解:
- 首先在Maven的
jaxb2-maven-plugin配置中,添加jaxb2-annotate-plugin扩展和对应依赖 - 新增自定义绑定文件
bindings.xjb,内容如下:
<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net" jxb:extensionBindingPrefixes="xjc annox"> <jxb:bindings schemaLocation="你的XSD文件路径.xsd" node="/xsd:schema/xsd:complexType[@name='Employee']/xsd:sequence/xsd:element[@name='salary']"> <jxb:property> <xjc:annotate target="field"> <annox:annotate>@javax.xml.bind.annotation.XmlElement(required = true)</annox:annotate> </xjc:annotate> </jxb:property> </jxb:bindings> </jxb:bindings>
- 在Maven插件配置中引入上述绑定文件,重新生成代码即可得到你期望的带
required = true注解的double类型字段。
方案2:改用Double包装类型(性价比最高的替代方案)
如果业务可以接受使用Double包装类而非基本类型double,只需要在XSD的salary字段上添加nillable="true"属性:
<xsd:element type="xsd:double" name="salary" minOccurs="1" nillable="true"/>
此时XJC会自动生成Double类型的字段,且自动带上@XmlElement(required = true, nillable = true)注解,既可以解决字段缺失的校验问题,还能区分「用户未传值」和「用户传了0值」两种场景,更符合接口校验的实际需求。
方案3:补充JSR380校验注解兜底
不管你用哪种生成方案,都可以给字段补充校验注解解决异常场景:
- 针对字段缺失的问题:如果是
Double类型添加@NotNull注解 - 针对传入字符串的问题:添加
@DecimalMin、@DecimalMax等数值校验注解,或者自定义反序列化器限制入参只能为数值类型。
内容的提问来源于stack exchange,提问作者mariaILikeIt
相关产品推荐
相关产品推荐

