我有一个xml文件,如下面的
<tag1>
<intag1>
<item>
<aaa>sdfdfsf</aaa>
<bbb>fvdfv</bbb>
</item>
</intag1>
<intag2>3</intag2>
</tag1>
我使用带有jaxb的spring批处理来读取xml并映射到对象。我有一个intag1
的对象模型,它的映射没有任何问题,但我想直接将intag2
映射到int
对象。这是我正在测试的示例代码,但这给了我以下例外。任何人都可以指出这个问题吗?
Jaxb2Marshaller jaxb2unmarshaller = new Jaxb2Marshaller();
jaxb2unmarshaller.setClassesToBeBound(int.class);
jaxb2unmarshaller.afterPropertiesSet();
StaxEventItemReader reader = new StaxEventItemReader();
reader.setResource(new InputStreamResource(new FileInputStream("test6.xml")));
reader.setUnmarshaller(jaxb2unmarshaller);
reader.setFragmentRootElementName("intag2");
reader.afterPropertiesSet();
reader.open(new ExecutionContext());
例外:
[com.sun.istack.internal.SAXParseException2; lineNumber: 105; columnNumber: 25; unexpected element (uri:"", local:"intag2"). Expected elements are (none)]
答案 0 :(得分:1)
这是由于课程javax.xml.bind.annotation
或int
上缺少java.lang.Integer
。
编辑(删除旧解决方案)
我设法通过这样做只映射<intag2>
:
读者:
<batch:reader>
<bean class="org.springframework.batch.item.xml.StaxEventItemReader">
<property name="fragmentRootElementName" value="intag2" />
<property name="resource" value="file:config/steps/test6.xml" />
<property name="unmarshaller">
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>Intag2</value>
</list>
</property>
</bean>
</property>
</bean>
</batch:reader>
映射类:
@XmlRootElement(name = "intag2")
public class Intag2 {
private Integer intag2;
@XmlElement(name = "intag2")
public Integer getIntag2() {
return intag2;
}
public void setIntag2(Integer intag2) {
this.intag2 = intag2;
}
}
看起来根元素也可以是同时读取的简单元素。
答案 1 :(得分:1)
大家好,我找到了这样做的方法,并在这里发布作为其他人的答案。
我们需要创建一个注释为RootElement
的模型类,如下所示,并且应该给出@XmlValue
标记以指示元素的值应该映射到整数字段。就是这样
@XmlRootElement(name = "intag2")
@XmlAccessorType(XmlAccessType.FIELD)
public class IV_TRAILER {
@XmlValue
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}