java – 使用JAXB生成的类用于需要具有模式的整数的元素
发布时间:2020-12-14 16:47:41 所属栏目:Java 来源:网络整理
导读:我的 XML Schema中有一个元素定义如下: xs:complexType name="MyNumberCodeType" xs:sequence xs:element name="Code" type="NumberCodeValueType" maxOccurs="unbounded" / /xs:sequence/xs:complexType 其中NumberCodeValueType是: xs:simpleType name="
|
我的
XML Schema中有一个元素定义如下:
<xs:complexType name="MyNumberCodeType">
<xs:sequence>
<xs:element name="Code" type="NumberCodeValueType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
其中NumberCodeValueType是: <xs:simpleType name="NumberCodeValueType">
<xs:restriction base="xs:int">
<xs:pattern value="[0-7]{7}"/>
</xs:restriction>
</xs:simpleType>
也就是说,我的号码可以从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<length; x++) {
result = "0" + result;
}
return result;
}
public static Integer parseInt(String value) {
return Integer.valueOf(value);
}
}
XMLSchema(format.xsd) 那么当你要从你的XML Schema生成你的类时: <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="number" type="NumberCodeValueType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="NumberCodeValueType">
<xs:restriction base="xs:int">
<xs:pattern value="[0-7]{7}" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
bindings.xml 您将利用JAXB绑定文件来引用您的格式化程序: <jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
<jxb:bindings schemaLocation="format.xsd">
<!--jxb:bindings node="//xs:simpleType[@name='NumberCodeValueType']" -->
<jxb:bindings node="//xs:element[@name='number']">
<jxb:property>
<jxb:baseType>
<jxb:javaType name="java.lang.Integer"
parseMethod="forum7182533.NumberFormatter.parseInt" printMethod="forum7182533.NumberFormatter.printInt" />
</jxb:baseType>
</jxb:property>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
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<String,Integer>
{
public Integer unmarshal(String value) {
return (forum7182533.NumberFormatter.parseInt(value));
}
public String marshal(Integer value) {
return (forum7182533.NumberFormatter.printInt(value));
}
}
根 将使用@XmlJavaTypeAdapter注释从您的域对象引用XmlAdapter: 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);
}
}
产量 您将获得所需的输出: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<number>0000004</number>
</root>
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
