我的XML模式中有一个定义如下的元素:
<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模式生成类时:
<?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));
}
}
根
在XmlAdapter
将使用由您的域对象引用@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);
}
}
输出量
您将获得所需的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<number>0000004</number>
</root>
MOXy BeanValide使我能够将验证添加到我的JAXB类中。 使用MOXy的“Bean Validation Plugin”,我可以根据预先存在的模式中的限制/方面在生成的JAXB类中进行Bean验证。 但是,有没有任何方法可以基于JAXB注释的java类的Bean验证注释生成带有限制/facetsb的模式? 在“模式优先”生成java时,XJC有一个方便的插件体系结构,但是是否有任何等效
我试图让Maven使用嵌套的xml模式生成JAXB绑定:模式a导入模式B。模式B导入模式C。 如果模式A中的对象引用了模式B中不依赖于模式C对象的对象,那么一切都构建得很好。如果模式B中的对象引用了模式C中的对象,它就会中断。也就是说,深入一层是可行的。去两个深度没有。 只要我在模式A中添加一个引用模式B中对象的对象,而模式B又引用了模式C中的对象,我就会得到一个组织。xml。萨克斯。SAXPar
myType也被定义为complexType。然后得到生成的类MyResponse.java和Reference.java。我可以通过以下方式分配“引用”的值: 而且奏效了。 现在我只是删除了maxOccurs=“unbounded”,它不再起作用了。响应不再是List类型,而是JaxBelement类型。我试着用: 谁能告诉我,当它不是一个列表时,什么是正确的做法?
我使用XML模式,并用xjc生成java文件,以便与JAXB一起使用。生成的java文件具有默认的@XmlAccessorType(XmlAccessType。字段)指定。我想改变这一点,使生成的java文件具有带注释的属性访问(@XmlAccessorType(XmlAccessType。属性),并且不在字段级别生成@XmlElement / @XmlAttribute批注。有没有办法通过自定义
我有一个maven模型项目,我通过maven命令-clean install生成jaxb类,jaxb类在目标文件夹下生成,jar文件在目标文件夹下生成。m2存储库文件夹。 现在在我的另一个项目中,将这个jar添加为具有适当组id和artifactId的依赖项。 但我得到的是生成的jaxb类的ClassNotFoundException和编译错误。 我正在更新我的问题以添加更多细节。 模型项目的Po
解组时出现以下错误: 错误中的“{}”具体指的是什么,如何解压缩以匹配输入XML中的内容和对象的期望?