将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