XJC生成扩展base64Binary元素的错误注解致WebService图片导出异常
解决XJC生成错误注解导致图片无法正确序列化为Base64的问题
我之前也碰到过类似的JAXB XJC代码生成的坑,给你几个实用的解决办法:
方法一:使用JAXB绑定文件强制生成正确注解
这是最推荐的方式,不用修改原始XSD,通过外部绑定规则告诉XJC生成带@XmlSchemaType的注解。
- 创建一个名为
binding.xml的绑定文件,内容如下:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.1"> <!-- 替换成你的XSD文件路径 --> <jaxb:bindings schemaLocation="your-schema.xsd"> <!-- 定位到image类型的扩展节点 --> <jaxb:bindings node="//xsd:complexType[@name='image']/xsd:simpleContent/xsd:extension"> <jaxb:property> <!-- 指定基础类型为base64Binary --> <jaxb:baseType name="xsd:base64Binary"/> </jaxb:property> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
- 执行XJC命令时带上绑定文件参数:
xjc -b binding.xml your-schema.xsd
这样生成的Image类中,value字段会自动带上@XmlSchemaType(name = "base64Binary")注解,和你手动修改后的效果一致。
方法二:调整XSD定义(可选)
如果你有权限修改原始XSD,可以尝试在simpleContent的扩展中显式强调基础类型的约束,虽然理论上你的原始XSD已经正确,但有时候XJC对某些结构的解析会有偏差:
<xsd:complexType name="image"> <xsd:simpleContent> <xsd:extension base="xsd:base64Binary"> <xsd:attribute name="nil" type="xsd:boolean" use="optional"/> <xsd:attribute name="overwrite" type="xsd:boolean" use="optional"/> <xsd:attribute name="origin" type="xsd:string" use="optional"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType>
不过这个方法不一定能解决所有情况,还是绑定文件更可靠。
方法三:手动修改生成的Java类(不推荐)
如果只是临时测试,可以手动给value字段加上@XmlSchemaType(name = "base64Binary"),但每次用XJC重新生成代码时都会覆盖这个修改,长期维护不建议这么做。
问题原因说明
XJC在处理扩展base64Binary的simpleContent结构时,默认只生成@XmlValue注解,没有自动关联@XmlSchemaType来标记该字段是Base64类型。这会导致JAXB序列化时把byte[]当成普通字节数组处理,输出[B@xxxxxxx这种对象引用字符串,而不是预期的Base64编码内容。
内容的提问来源于stack exchange,提问作者KennyZgz
相关产品推荐
相关产品推荐

