Я новичок в Apache Camel и имитирую тестирование, так что вот оно...
У меня есть XML без схемы XSD, которую я не имеют влияния. Дочерние элементы этого XML содержат данные, которые я хочу привязать к своему бизнес-поджо. Этот POJO (WeatherCurrent) уже аннотирован JPA, и я думал добавить аннотацию JAXB, чтобы разделенный XML можно было сопоставить с моим POJO.
Поскольку этот XML имеет корневой элемент, и мне нужны только его дочерние элементы (metData), у меня возникла проблема с аннотированием моего POJO, поскольку я не могу использовать @XmlRootElement.
Это частично описано здесь: http://camel.apache.org/splitter.htmlв главе Потоковая передача больших полезных данных XML с использованием языка Tokenizer. Мой POJO похож на элемент orderxml в этом примере. Мне нужно всего несколько элементов из элемента metData xml для сопоставления с моими полями POJO.
Существует также глава Частичная маршаллинг/демаршаллингна http://camel.apache.org/jaxb.html, но там нет примера JAVA DSL (обязательный), ни как аннотировать pojo для работы с фрагментами XML.
На данный момент у меня есть такой тестовый код:
import java.io.File;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.converter.jaxb.JaxbDataFormat;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
public class WeatherCurrentTest extends CamelTestSupport {
@EndpointInject(uri = "file:src/test/resources")
private ProducerTemplate inbox;
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
DataFormat jaxbDataFormat = new JaxbDataFormat("com.mycompany.model.entities.weather");// WARNING two packages for JaxbDataFormat
from("file:src/test/resources/?fileName=observation_si_latest.xml&noop=true&idempotent=false")
.split()
.tokenizeXML("metData")
.unmarshal(jaxbDataFormat)
.to("mock:meteo");
}
};
}
@Test
public void testMetData() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:meteo");
mock.expectedMessageCount(9);
File meteo = new File("src/test/resources/observation_si_latest.xml");
String content = context.getTypeConverter().convertTo(String.class, meteo);
inbox.sendBodyAndHeader(content, Exchange.FILE_NAME, "src/test/resources/observation_si_latest.xml");
mock.assertIsSatisfied();
}
}
XML (observation_si_latest.xml) имеет следующую форму:
sl
55
NOVA GORICA
BILJE
09.03.2012 15:00 CET
15
KREDA-ICA_
Для краткости я опустил множество элементов из элементов metData.Я хочу сопоставить (среди прочего) domain_title с моим аннотированным JPA полем станции POJO, а затем сохранить его базу данных, надеюсь, все в одном умном и коротком маршруте Camel.
POJO (пока нет аннотаций JAXB):
@Entity
@Table(name="weather_current")
public class WeatherCurrent implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String station;
@Temporal( TemporalType.TIMESTAMP)
@Column(name="successfully_updated")
private Date successfullyUpdated;
private short temperature;
@Column(name="wind_direction")
private String windDirection;
}
Я также пропустил множество полей и методов.
Итак, идея состоит в том, чтобы сопоставить значение *domain_title* с полем WeatherCurrent POJO stationи сделать это для каждого элемента metData, а также сохранить список объектов WeatherCurrent в базе данных.
Любые советы о том, как это реализовать, приветствуются.