Как создать маршрут Camel, который принимает XML и привязывает некоторые данные к аннотированному JPA POJO?

Я новичок в 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 в базе данных.

Любые советы о том, как это реализовать, приветствуются.

8
задан bbcooper 14 March 2012 в 13:25
поделиться