मैं अपाचे कैमल और नकली परीक्षण के लिए नया हूं इसलिए यह जाता है ...एक ऊंट मार्ग कैसे बनाएं जो एक्सएमएल लेता है और जेपीए एनोटेटेड पीओजेओ को कुछ डेटा बाध्य करता है?
मेरे पास कोई एक्सएसडी स्कीमा वाला एक्सएमएल है जिसका मेरा कोई प्रभाव नहीं है। इस एक्सएमएल के बाल तत्व डेटा धारण करते हैं जो मैं अपने व्यापार pojo से बांधना चाहता हूं। यह POJO (WeatherCurrent) पहले ही जेपीए एनोटेटेड है और मैं जेएक्सबी एनोटेशन जोड़ने की सोच रहा था, इसलिए विभाजित एक्सएमएल को मेरे पीओजेओ में मैप किया जा सकता है।
चूंकि इस एक्सएमएल में मूल तत्व है और मैं केवल अपने बच्चों को चाहता हूं (मेटाडाटा) मुझे समस्या है कि मेरे POJO को एनोटेट कैसे करें क्योंकि मैं @XmlRootElement का उपयोग नहीं कर सकता।
यह आंशिक रूप से वर्णित है: http://camel.apache.org/splitter.htmlटोकनज़र भाषा अध्याय का उपयोग करके बड़े एक्सएमएल पेलोड स्ट्रीमिंग। मेरा POJO उस उदाहरण में ऑर्डर xml तत्व जैसा है। मुझे अपने POJO फ़ील्ड में मैप करने के लिए मेटाडेटा xml तत्व से कुछ तत्वों की आवश्यकता है।
वहाँ भी/एक अध्याय आंशिक मार्शलिंग है http://camel.apache.org/jaxb.html पर unmarshalling लेकिन कोई जावा डीएसएल उदाहरण (बहुत जरूरी), और न ही कैसे POJO एक्सएमएल टुकड़े के साथ काम करने पर टिप्पणी करने के लिए है।
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();
}
}
एक्सएमएल (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>
मैं संक्षिप्तता के लिए metData तत्वों के तत्वों के बहुत सारे बाहर छोड़ दिया
अब तक मैं इस परीक्षण कोड है । मैं अपने जेपीए एनोटेटेड पीओजेओ के स्टेशन क्षेत्र में डोमेन_टाइटल को मैप करना चाहता हूं और बाद में डेटाबेस को सहेजना चाहता हूं, उम्मीद है कि सभी एक स्मार्ट और शॉर्ट कैमल मार्ग में।
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;
}
मैं भी बाहर छोड़ दिया खेतों और तरीकों की बहुत सारी।
तो विचार WeatherCurrent POJO के स्टेशन क्षेत्र के लिए * DOMAIN_TITLE * का मान नक्शा और प्रत्येक metData तत्व के लिए ऐसा करने के लिए और WeatherCurrent डेटाबेस के लिए वस्तुओं की एक सूची को बचाने के लिए है।
इसका कार्यान्वयन करने के तरीके पर सबसे अच्छा तरीका किसी भी सलाह का स्वागत है।
सबसे पहले विभाजन एक पैरामीटर लेता है। दूसरा एक्सएमएल से डेटा को हटाने के लिए xpath या xlst के बारे में कैसे? आप XML को मार्शल कर सकते हैं, या xpath या xlst वाले डेटा तक पहुंच सकते हैं। क्या सबसे अच्छा काम करता है? – chrislovecnm