2012-03-14 32 views
8

मैं अपाचे कैमल और नकली परीक्षण के लिए नया हूं इसलिए यह जाता है ...एक ऊंट मार्ग कैसे बनाएं जो एक्सएमएल लेता है और जेपीए एनोटेटेड पीओजेओ को कुछ डेटा बाध्य करता है?

मेरे पास कोई एक्सएसडी स्कीमा वाला एक्सएमएल है जिसका मेरा कोई प्रभाव नहीं है। इस एक्सएमएल के बाल तत्व डेटा धारण करते हैं जो मैं अपने व्यापार 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 डेटाबेस के लिए वस्तुओं की एक सूची को बचाने के लिए है।

इसका कार्यान्वयन करने के तरीके पर सबसे अच्छा तरीका किसी भी सलाह का स्वागत है।

+0

सबसे पहले विभाजन एक पैरामीटर लेता है। दूसरा एक्सएमएल से डेटा को हटाने के लिए xpath या xlst के बारे में कैसे? आप XML को मार्शल कर सकते हैं, या xpath या xlst वाले डेटा तक पहुंच सकते हैं। क्या सबसे अच्छा काम करता है? – chrislovecnm

उत्तर

2

यह पता चला कि मुझे @XmlRootElement का उपयोग करने में सक्षम नहीं होने का एक गलत धारणा थी। POJO को एनोटेट करने के बाद मार्ग और परीक्षण सफलतापूर्वक गुजरता है और इसके बगल में jaxb.index फ़ाइल जोड़ता है। बाद में या कल समाधान पोस्ट करेंगे क्योंकि मैं अब ट्रेन में हूं।

घंटों बाद ...

POJO (जेपीए वालों के ऊपर) पर JAXB एनोटेशन:

@Entity 
@Table(name="weather_current") 
@XmlRootElement(name = "metData") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class WeatherCurrent implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @XmlElement(name = "nn_shortText") 
    private String conditions; 

    @XmlElement(name = "rh") 
    private short humidity; 

    @XmlElement(name = "msl") 
    private short pressure; 

    @Column(name="pressure_tendency") 
    @XmlElement(name = "pa_shortText") 
    private String pressureTendency; 

    @Temporal(TemporalType.TIMESTAMP) 
    @XmlElement(name = "tsValid_issued") 
    private Date published; 

    @XmlElement(name = "domain_longTitle") 
    private String station; 

WeatherCurrent Exchage वस्तुओं की एक सूची प्राप्त करने के लिए मुझे सक्षम होना चाहिए।बस परीक्षण के लिए मैं अपने EchoBean को हर एक से कराई एक संपत्ति प्रिंट:

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

और EchoBean:

public class EchoBean { 

    public String printWeatherStation(WeatherCurrent weatherCurrent) { 
     return weatherCurrent.getStation(); 
    } 
} 

अच्छी तरह से लॉग इन करें कैमल घटक के साथ मौसम स्टेशनों के नाम प्रिंट करता है।

एक गैर-दस्तावेजी बात यह है कि परेशान मुझे लगता है कि मैं अगले WeatherCurrent जावा स्रोत इस jaxb.index फ़ाइल डाल करने के लिए किया था, हालांकि http://camel.apache.org/jaxb.html में यह स्पष्ट रूप से कहा गया है कि JAXB संदर्भ

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

इसकी एक जेएक्सबी आवश्यकता है, या तो आपके पास jaxb.index फ़ाइल है, या आप एक कस्टम ऑब्जेक्ट फैक्टरी प्रदान करते हैं। NewInstance विधि के लिए javadoc देखें: http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/JAXBContext.html –

2

साथ आरंभ नहीं हो जाता pom.xml में था

<dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jaxb</artifactId> 
     <version>2.13.0</version> 
    </dependency> 

अगला @XmlRootElement साथ POJO वर्ग व्याख्या (नाम = "कर्मचारी")

- निम्नलिखित निर्भरता शामिल
package com.javainuse.model; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "employee") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Employee { 

    private String empName; 
    private int empId; 

    public String getEmpName() { 
     return empName; 
    } 

    public void setEmpName(String empName) { 
     this.empName = empName; 
    } 

    public int getEmpId() { 
     return empId; 
    } 

    public void setEmpId(int empId) { 
     this.empId = empId; 
    } 
} 

अंततः रूटबिल्डर वर्ग में जैक्सबी डेटाफॉर्मेट को परिभाषित करें और इसे मार्ग में उपयोग करें।

// XML Data Format 
     JaxbDataFormat xmlDataFormat = new JaxbDataFormat(); 
     JAXBContext con = JAXBContext.newInstance(Employee.class); 
     xmlDataFormat.setContext(con); 

from("file:C:/inputFolder").doTry().unmarshal(xmlDataFormat). 
     process(new MyProcessor()).marshal(jsonDataFormat). 
     to("jms:queue:javainuse") 

स्रोत कोड और अधिक जानकारी के - Apache Camel - Marshalling/Unmarshalling XML/JSON Data

संबंधित मुद्दे