如何在JAXB绑定中无需适配器将date类型属性转为String?
问题说明
我有一份第三方Schema,其中某个属性类型定义错误(为xs:date),需要通过外部绑定文件将其转换为java.lang.String类型以生成正确的Java类。但当前实现会生成一个冗余的Adapter1类(仅做字符串到字符串的无意义转换),希望避免生成该类。
Schema属性定义
<xs:attribute type="xs:date" name="curso" use="required"> </xs:attribute>
当前绑定文件
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <jxb:bindings schemaLocation="file.xsd" node="/xs:schema"> <jxb:bindings node="//xs:element[@name='exportacion_horarios']//xs:attribute[@name='curso']" > <jxb:property> <jxb:baseType > <jxb:javaType name="java.lang.String" /> </jxb:baseType> </jxb:property> </jxb:bindings> </jxb:bindings> </jxb:bindings>
生成的冗余适配器类
package com.penalara.ghc_importar_exportar.modelo.personalizados.itaca3.exportacion; import javax.xml.bind.annotation.adapters.XmlAdapter; public class Adapter1 extends XmlAdapter<String, String> { public String unmarshal(String value) { return new String(value); } public String marshal(String value) { if (value == null) { return null; } return value.toString(); } }
解决方案
可以通过修改绑定文件,让XJC直接复用内置的字符串处理逻辑,避免生成冗余适配器。
调整后的绑定文件
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <jxb:bindings schemaLocation="file.xsd" node="/xs:schema"> <jxb:bindings node="//xs:element[@name='exportacion_horarios']//xs:attribute[@name='curso']" > <jxb:javaType name="java.lang.String" xmlType="xs:date" /> </jxb:bindings> </jxb:bindings> </jxb:bindings>
原理说明
- 原写法通过
<jxb:property>嵌套<jxb:baseType>再设置<jxb:javaType>,会触发XJC强制生成自定义适配器,即使转换逻辑完全冗余。 - 调整后直接在目标属性节点上使用
<jxb:javaType>,同时指定xmlType为原Schema类型(xs:date)、javaType为目标Java类型(java.lang.String),XJC会识别到这是字符串类型的直接映射,无需额外适配器,直接复用内置处理逻辑。
内容的提问来源于stack exchange,提问作者PhoneixS
相关产品推荐
相关产品推荐

