将JAXB生成的类用于需要带有模式的整数的元素
我的XML Schema中有一个元素,定义如下:
NumberCodeValueType的位置是:
也就是说,我的号码可以从前导0开始。 我无法修改此架构。 我正在使用JAXB来生成我的Java类。 不幸的是, Code
元素的访问器将整数列表作为参数,这意味着所有前导0都被剥离(因为,据我所知,使用整数类型时无法在Java中保持前导0)!
有什么办法可以解决这个问题吗?
谢谢你的帮助!
您可以执行以下操作:
的NumberFormatter
您可以通过编写自己的格式化程序来完成此操作:
package forum7182533; public class NumberFormatter { public static String printInt(Integer value) { String result = String.valueOf(value); for(int x=0, length = 7 - result.length(); x
XMLSchema(format.xsd)
然后,当您要从XML Schema生成类时:
bindings.xml
您将利用JAXB绑定文件来引用您的格式化程序:
XJC电话
绑定文件在XJC调用中被引用为:
xjc -d out -p forum7182533 -b bindings.xml format.xsd
适配器1
这将导致创建利用格式化程序的XmlAdapter
:
package forum7182533; import javax.xml.bind.annotation.adapters.XmlAdapter; public class Adapter1 extends XmlAdapter { public Integer unmarshal(String value) { return (forum7182533.NumberFormatter.parseInt(value)); } public String marshal(Integer value) { return (forum7182533.NumberFormatter.printInt(value)); } }
根
将使用@XmlJavaTypeAdapter
批注从域对象中引用@XmlJavaTypeAdapter
:
package forum7182533; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "number" }) @XmlRootElement(name = "root") public class Root { @XmlElement(required = true, type = String.class) @XmlJavaTypeAdapter(Adapter1 .class) protected Integer number; public Integer getNumber() { return number; } public void setNumber(Integer value) { this.number = value; } }
演示
现在,如果您运行以下演示代码:
package forum7182533; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Root.class); Root root = new Root(); root.setNumber(4); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(root, System.out); } }
产量
您将获得所需的输出:
0000004