2016-04-27 7 views
2

In meiner Route versuche ich eine eingehende XML-Nachricht zu entpacken. Wenn ich jedoch den Code ausführe, überspringt er die Ausführung des .processors, und ich kann den tatsächlichen Fehler nicht herausfinden (da er keinen gibt).Konnte mit jaxb in Kamel nicht abmarshalen. Prozessor wird nicht aufgerufen

Der Code:

package nl.hari.local.cust; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import org.apache.camel.CamelContext; 
import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 
import org.apache.camel.model.dataformat.JaxbDataFormat; 
public class XMLtoObject_Camel { 
    public static void main(String[] args) throws Exception { 
     CamelContext context = new DefaultCamelContext(); 
     JaxbDataFormat jaxbDataFormat = new JaxbDataFormat(); 
     JAXBContext con = JAXBContext.newInstance(Address.class); 
     context.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
      from("file://C:/Hari/TstFolder/" 
        + "?noop=true" + "&autoCreate=false" + "&flatten=false" + "&delete=false" 
        + "&bufferSize=128") 
      .unmarshal(jaxbDataFormat) 
//Doesn't invoke processor - start 
      .process(new Processor(){ 
       public void process(Exchange exchange) throws Exception { 
        Address add = (Address) exchange.getIn().getBody(); 
        System.out.println("city is" + add.getCity()); 
       } 
      }); 
//Doesn't invoke processor - End 
      } 
     }); 
    } 
} 

Dies ist das Schema ich verwende. Der XML-Code, den ich zum Testen verwende, wird in Eclipse generiert. Dies sind auch die JAXB-Klassen.

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.hari.nl/Address" 
     xmlns:tns="http://www.cimt.nl/Address" 
     elementFormDefault="qualified"> 
    <element name="address"> 
    <complexType> 
     <sequence> 
     <element type="string" name="city"/> 
     <element type="string" name="country"/> 
     </sequence> 
     <attribute type="byte" name="id"/> 
    </complexType> 
    </element> 
</schema> 

Der Link unten enthält Screen Grab von Projektstruktur http://i.stack.imgur.com/4IWhD.png

+0

JAXB generierte Klassen sollten ObjectFactory haben. Ich sehe es nicht in Ihrer Projektstruktur! –

+0

Ich habe das Bild wie vorgeschlagen aktualisiert. Nach dem Einfügen des Snippets kann ich es immer noch nicht in den Prozessor bringen. Ich habe den Code im Git-Repository mit den Änderungen aktualisiert, wie empfohlen, als Referenz. https://github.com/navigator007/MyRepo.git –

+0

Haben Sie es erneut versucht. Hat es funktioniert!? –

Antwort

1

Sie sollten

Code unten etwas wie Schnipsel verwenden
  ClassLoader cl = ObjectFactory.class.getClassLoader(); 
      JAXBContext jc = JAXBContext.newInstance(SomeGeneratedClass.class.getPackage().getName(), cl); 
      JaxbDataFormat jaxb = new JaxbDataFormat(jc); 
      jaxb.setPartClass(SomeGeneratedClass.class.getName()); 

Auch bevor es zu String Deserialisieren konvertieren.

.convertBodyTo(String.class) 
.unmarshal(jaxb) 

Der endgültige Code sollte wie folgt aussehen.

package nl.hari.local.cust; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 

import org.apache.camel.ExchangePattern; 
import org.apache.camel.LoggingLevel; 
import org.apache.camel.ValidationException; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.converter.jaxb.JaxbDataFormat; 

import org.apache.camel.CamelContext; 
import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.camel.ProducerTemplate; 
import org.apache.camel.impl.DefaultCamelContext; 

import nl.hari.local.jaxb.Address; 
import nl.hari.local.jaxb.ObjectFactory; 

public class Camel_JAXB_UnMarshal { 

    public static void main(String[] args) throws Exception { 
     CamelContext context = new DefaultCamelContext(); 
     try { 

      ClassLoader cl = ObjectFactory.class.getClassLoader(); 
      JAXBContext jc = JAXBContext.newInstance(Address.class.getPackage().getName(), cl); 
      final JaxbDataFormat jaxb = new JaxbDataFormat(jc); 
      jaxb.setPartClass(Address.class.getName()); 

      context.addRoutes(new RouteBuilder() { 
       @Override 
       public void configure() throws Exception { 
        from("file:resources"). //This can be changed as per ur requirement. 
        convertBodyTo(String.class) 
        .unmarshal(jaxb) 
        .process(new Processor() { 

         public void process(Exchange exchange) throws Exception { 
          Address add = (Address) exchange.getIn().getBody(); 
          System.out.println("city is" + add.getCity()); 

         } 

        }); 
       } 
      }); 
      context.start(); 
      Thread.sleep(2000); 
     } finally { 
      context.stop(); 
     } 
    } 
} 

Und Eclipse-Verzeichnisstruktur.

enter image description here