无法使用Camel JacksonXML对XML进行解组



我正试图简单地将XML文件解组如下:

<?xml version="1.0" encoding = "UTF-8" ?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<products>
<product>
<facet type="string" elementType="string" name="Weight (g)"><![CDATA[210]]></facet>
</product>
</products>
</feed>

我有这样的课程:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
public class Feed {
private Products products;
}

Products:子类

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Products {
private List<Product> products;
}

Product:子类

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
@XmlElement(name = "facet")
private List<Facet> facet;
}

最后是Facet:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Facet {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "type")
private String type;
@XmlElement(name = "elementType")
private String elementType;
private String content;
}

我给unmarshall写的骆驼路线如下:

@Component
public class XMLSplitterRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("file:src/main/resources/files/xml").routeId("xmlUmarshaller")
.log("body: ${body}")
.unmarshal().jacksonXml(Products.class)
.log("The unmarshalled object is ${body}")
.marshal().json()
.to("activemq:json-marshal-queue");
}
}

但我一直得到以下错误:

com.fasterxml.jackson.databind.JsonMappingException: Unexpected non-whitespace text ('210' in Array context: should not occur (or should be handled)
at [Source: (BufferedInputStream); line: 29, column: 96] (through reference chain: com.sammy.model.Products["products"]->java.util.ArrayList[0]->com.sammy.model.Product["facet"])

Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected non-whitespace text ('210' in Array context: should not occur (or should be handled)
at [Source: (BufferedInputStream); line: 29, column: 96]

这意味着,它似乎不知道如何处理XML文件的cdata中的值!我到处都找过,但没有看到任何潜在的解决方案。求你了,救命!!!

根据Nicolas Filotto的建议,我首先将XML转换为XSD,然后使用xjc生成POJO,从而修复了映射。对于Camel解组过程,我将其从jacksonXML更改为使用Jaxb转换器。

@Component
public class XMLSplitterRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
DataFormat jaxb = new JaxbDataFormat("com.sammy.model");
from("file:src/main/resources/files/xml").routeId("xmlSplitter")
.log("body: ${body}")
.unmarshal(jaxb)
.log("The unmarshalled object is ${body}")
}
}

这现在很有魅力!!!

最新更新