JaxB unmarshall单个原始元素

时间:2016-01-18 06:38:54

标签: xml jaxb spring-batch unmarshalling jaxb2

我有一个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)]

2 个答案:

答案 0 :(得分:1)

这是由于课程javax.xml.bind.annotationint上缺少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;
    }
}