Java 如何创建一个接受XML并将一些数据绑定到JPA注释的POJO的驼峰路由?

Java 如何创建一个接受XML并将一些数据绑定到JPA注释的POJO的驼峰路由?,java,xml,jpa,jaxb,apache-camel,Java,Xml,Jpa,Jaxb,Apache Camel,我对ApacheCamel和模拟测试还不熟悉,所以现在开始 我有一个没有XSD模式的XML,我对它没有影响。这个XML的子元素包含我想要绑定到我的业务pojo的数据。这个POJO(WeatherCurrent)已经是JPA注释的,我正在考虑添加JAXB注释,以便将拆分的XML映射到我的POJO 因为这个XML有一个根元素,我只需要它的子元素(metData),所以我有一个问题,就是如何注释我的POJO,因为我不能使用@XmlRootElement 这里对这一点进行了部分描述:在“使用标记器语言流

我对ApacheCamel和模拟测试还不熟悉,所以现在开始

我有一个没有XSD模式的XML,我对它没有影响。这个XML的子元素包含我想要绑定到我的业务pojo的数据。这个POJO(WeatherCurrent)已经是JPA注释的,我正在考虑添加JAXB注释,以便将拆分的XML映射到我的POJO

因为这个XML有一个根元素,我只需要它的子元素(metData),所以我有一个问题,就是如何注释我的POJO,因为我不能使用@XmlRootElement

这里对这一点进行了部分描述:在“使用标记器语言流式传输大型XML有效负载”一章中。我的POJO类似于该示例中的order xml元素。我只需要metdataxml元素中的几个元素就可以映射到我的POJO字段

在中也有部分编组/解编组一章,但没有JavaDSL示例(必须),也没有如何注释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)的形式如下:

<?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>
我还遗漏了很多字段和方法

因此,我们的想法是将*domain_title*的值映射到WeatherCurrent POJO的station字段,并对每个metData元素进行映射,并将WeatherCurrent对象列表保存到数据库中


欢迎就如何实现这一点的最佳方法提供任何建议。

事实证明,我有一个错误的假设,即无法使用@XmlRootElement。在我注释POJO并在其旁边添加jaxb.index文件后,路由和测试成功通过。稍后或明天将发布解决方案,因为我现在在火车上

几个小时后

POJO上的JAXB注释(在JPA注释之上):

使我能够获得WeatherCurrent Exchage对象的列表。为了进行测试,我将每个属性路由到EchoBean以打印出一个属性:

.unmarshal(jaxbDataFormat).bean(EchoBean.class, "printWeatherStation")
和EchoBean:

public class EchoBean {

    public String printWeatherStation(WeatherCurrent weatherCurrent) {
        return weatherCurrent.getStation();
    }
}
使用log Camel组件很好地打印出气象站的名称

困扰我的一件未记录的事情是,我不得不将这个jaxb.index文件放在当前java源代码的旁边,尽管它清楚地表明jaxb上下文是用

DataFormat jaxb = new JaxbDataFormat("com.acme.model");

第一次剥离采用一个参数。其次,使用xpath或xlst从XML中删除数据怎么样?您可以封送XML,或者使用xpath或xlst访问数据。什么最有效?这是一个JAXB需求,要么您有一个JAXB.index文件,要么您提供一个定制的ObjectFactory。请参阅javadoc for newInstance方法:
public class EchoBean {

    public String printWeatherStation(WeatherCurrent weatherCurrent) {
        return weatherCurrent.getStation();
    }
}
DataFormat jaxb = new JaxbDataFormat("com.acme.model");