Для начала я создаю несколько маршрутов, используя Camel ver 2.15 (в Fuse 6.2.1).
На моем пути я пытаюсь создать XML из pojo, сгенерированного с использованием плагина cxf-xjc maven (cxf-xjc где-то прочитал xsd, а затем из xsd были созданы pojos с аннотациями jaxb).
Pojos - это TempProject и TempProjects.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "",
propOrder = {"ecode", "tempName"}
)
@XmlRootElement(
name = "TempProject"
)
public class TempProject implements Serializable {
@XmlElement(
name = "Ecode",
required = true
)
protected String ecode;
@XmlElement(
name = "TempName",
required = true
)
protected String tempName;
public TempProject() {
}
public String getEcode() {
return this.ecode;
}
public void setEcode(String value) {
this.ecode = value;
}
public String getTempName() {
return this.tempName;
}
public void setTempName(String value) {
this.tempName = value;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "",
propOrder = {"tempProjects"}
)
@XmlRootElement(
name = "TempProjects"
)
public class TempProjects implements Serializable {
@XmlElement(
name = "TempProject",
required = true
)
protected List<TempProject> tempProjects;
public TempProjects() {
}
public List<TempProject> getTempProjects() {
if (this.tempProjects == null) {
this.tempProjects = new ArrayList();
}
return this.tempProjects;
}
}
Я могу сгенерировать xml, используя этот код:
JAXBContext jaxbContext = JAXBContext.newInstance(new Class[]{TempProjects.class});
jaxbContext.createMarshaller();
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(jaxbContext); //import org.apache.camel.converter.jaxb.JaxbDataFormat;
Я звоню
.marshal(jaxbDataFormat)
на моем пути, чтобы выполнить сортировку из ПОЖО в XML.
Сгенерированный xml размещен ниже:
<TempProjects xmlns="http://blah.blah/foo/schema/v2">
<TempProject>
<Ecode>1</Ecode>
<TempName>Tempname1</TempName>
</TempProject>
<TempProject>
<Ecode>2</Ecode>
<TempName>Tempname2</TempName>
</TempProject>
Как мне создать маршаллированный xml, который будет иметь пространство имен, подобное этому ...
<TempProjects xmlns:myprefix="http://blah.blah/foo/schema/v2">
Причина, по которой мне понадобился префикс пространства имен, заключается в том, что я планирую разделить значения (например, Ecode) в xml с использованием xpath, и мне для этого нужен префикс пространства имен (это то, что я исследовал, я мог бы быть неправильно).
Мой запланированный код в моем маршруте
.marshal(jaxbDataFormat)
.split( xpath("/TempProjects/TempProject/Ecode/text()").namespaces(ns1),
new ProjectIdsAggregator()) //the above xpath doesn't work because it doesn't have a namespace prefix
//Namespaces ns1 = new Namespaces("myprefix", "http://blah.blah/foo/schema/v2" );
Я посмотрел на jaxbDataFormat.setNamespacePrefixRef ("myprefix"), но я получил ошибку ( org.apache.camel.NoSuchBeanException: в реестре не найден компонент для: myprefix типа: java.util. Карта )
Я на самом деле довольно новичок в мире маршрутизации верблюдов Apache, так что я могу упустить некоторые базовые вещи.