Jestem nowy dla Apache Camel i próbnego testowania, więc tutaj jest ...Jak utworzyć trasę wielbłądzową, która pobiera XML i wiąże niektóre dane do JPG z adnotacjami?
Mam XML bez schematu XSD, na który nie mam wpływu. Elementy potomne tego pliku XML przechowują dane, które chcę powiązać z moim biznesem pojo. To POJO (WeatherCurrent) jest już oznaczone adnotacją JPA i myślałem o dodaniu adnotacji JAXB, aby podzielony XML mógł zostać zmapowany do mojego POJO.
Ponieważ ten plik XML ma element główny, a ja chcę tylko jego childs (metData), mam problem z adnotacją mojego POJO, ponieważ nie mogę użyć @XmlRootElement.
To jest częściowo opisane tutaj: http://camel.apache.org/splitter.html o Przesyłanie strumieniowe dużych danych XML za pomocą języka Tokenizer rozdział. Moje POJO jest jak zamówienie element xml w tym przykładzie. Potrzebuję tylko kilku elementów z elementu xml metData do mapowania do moich pól POJO.
Jest też rozdział Częściowa marshalling/unmarshalling na http://camel.apache.org/jaxb.html ale nie jest przykładem JAVA DSL (obowiązkowa), ani jak opisanie POJO do pracy z fragmentów XML.
tej pory mam ten kod testowy:
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) dostarczana jest w tej postaci:
<?xml version="1.0" encoding="UTF-8"?>
<data id="MeteoSI_WebMet_observation_xml">
<language>sl</language>
<metData>
<domain_altitude>55</domain_altitude>
<domain_title>NOVA GORICA</domain_title>
<domain_shortTitle>BILJE</domain_shortTitle>
<tsValid_issued>09.03.2012 15:00 CET</tsValid_issued>
<t_degreesC>15</t_degreesC>
</metData>
<metData>
<domain_meteosiId>KREDA-ICA_</domain_meteosiId>
Pominąłem wiele elementów elementów metData dla zwięzłości . Chcę zmapować (między innymi) domain_title do mojego stanowiska JPA przypisanego do pola stacji, a następnie zapisać bazę danych, mam nadzieję, że wszystko w jednym inteligentnym i krótkim torze Camel.
POJO (brak adnotacji JAXB jeszcze):
@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;
}
ja też pominąć wiele pól i metod.
Chodzi więc o odwzorowanie wartości pola * domain_title * na pole WeatherCurrent POJO o numerze i wykonanie tego dla każdego elementu metData i zapisanie listy obiektów WeatherCurrent w bazie danych.
Wszelkie rady dotyczące najlepszego sposobu realizacji tego są mile widziane.
pierwsze podzielone przyjmuje parametr. Po drugie, jak o xpath lub xlst, aby usunąć dane z XML? Możesz Marszałkowi XML lub uzyskać dostęp do danych za pomocą xpath lub xlst. Co działa najlepiej? – chrislovecnm