在JAXB和Spring中处理域对象的集合

时间:2014-05-19 13:21:22

标签: spring-integration jaxb2 spring-oxm

我们有一个Spring Integration应用程序,它使用JDBC轮询器和RowMapper从数据库中读取并输出域对象的集合(假设结果集返回多行)。

然后将域对象编组为XML。当使用Castor作为编组器时,这可以正常工作,XML表示域对象的集合:

<array-list>
   <order>
     <orderID>23940210</orderID>
     ...
   </order>
   <order>
   ...
</array-list>

我们现在希望从Castor切换到JAXB。 这是XML中JAXB编组器的定义:

<oxm:jaxb2-marshaller id="jaxbMarshallerBean">
   <oxm:class-to-be-bound name="com.mycompany.Order" />
</oxm:jaxb2-marshaller>

... JAXB marshaller用作Spring Integration链中使用的变换器..

<int:chain input-channel="input" output-channel="output-jms">
    <si-xml:marshalling-transformer id="defaultMarshaller" marshaller="jaxbMarshallerBean" />
</int:chain>

当然域类是注释的:

@XmlRootElement(namespace ="Order")  
public class Order{
     ...

   @XmlElement(name="OrderID")    
   public String getOrderId() {
       return orderId;
   }

现在,抛出以下异常:

org.springframework.oxm.UncategorizedMappingException: 
Unknown JAXB exception; 
nested exception is javax.xml.bind.JAXBException: 
class java.util.ArrayList nor any of its super class is known to this context.

看起来JAXB不喜欢它处理域对象集合的事实。配置或处理此问题的正确方法是什么?

非常感谢

1 个答案:

答案 0 :(得分:0)

当然,您需要一个解组转换器从XML转到POJO。

我不知道是否有办法配置JAXB直接处理它,但你可以在unmarshaller之前添加一个XPath拆分器,然后在它之后添加一个聚合器。