2017-09-21 2 views
0

J'essaie d'utiliser Apache Camel pour analyser XML à POJO et avoir un problème avec l'impression de la POJO réelle. Au lieu de cela, je reçois du code XML comme si aucune conversion ne se produisait. Quand je passe par exemple, le client instaure des clients qui fonctionnent correctement. Également l'impression des clients classe à sout dans les fèves de haricots parfaitement.Camel ne veut pas imprimer POJO dans java DSL route

MyRoute 
    @Autowired 
    private MyBean mb; 
    @Override 
    public void configure() throws Exception { 
     from("file:{{customer.path}}?noop=true") 
       .bean(mb) 
       .to("stream:out"); 
    } 


MyBean 

    @Handler 
    public Customers whatIsInBody(Customers body) { 
     return body; 
    } 

classes POJO:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "customer" 
}) 
@XmlRootElement(name = "customers") 
public @Data 
class Customers { 

    @XmlElement(required = true, nillable = true) 
    protected List<Customer> customer; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "customer", propOrder = { 
    "id", 
    "name", 
    "adress", 
    "countryCode", 
    "products" 
}) 
public @Data 
class Customer { 

    protected long id; 
    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String adress; 
    @XmlElement(required = true) 
    protected String countryCode; 
    @XmlElement(required = true, nillable = true) 
    protected List<Product> products; 
} 

Exemple de sortie:

<customers> 
    <customer> 
     <id>12345</id> 
     <name>str1234</name> 
     <adress>str1234</adress> 
     <countryCode>str1234</countryCode> 
     <products> 
      <id>12345</id> 
      <name>str1234</name> 
     </products> 
    </customer> 

sortie souhaitée:

Customers(customer=[Customer(id=12345, name=str1234, adress=str1234, countryCode=str1234, products=[Product(id=12345, name=str1234)]), 
+0

Avez-vous regardé des formats de données Camel? Il y a des formats de données intégrés pour Jackson XML et d'autres qui peuvent faire l'unmarshalling automatique pour vous. http://camel.apache.org/jackson-xml.html –

+0

@SoucianceEqdamRashti Je l'ai essayé avec jaxb sur une page principale - ça marche bien, quand j'essaie d'ajouter .unmarshal (jaxb) où jaxb est JAXBContext jc = JAXBContext .newInstance (Customers.class); DataFormat jaxb = new JaxbDataFormat (jc); mais quand je l'ajoute à la route - rien ne se passe ... – Eugene

+0

Avez-vous fait comme décrit ici? https://stackoverflow.com/questions/26800182/jaxb-marshalling-in-apache-camel –

Répondre

0

Lorsque vous avez chameau JAXB sur le chemin de classe, puis un POJO classe avec les annotations JAXB est le type converti en XML lorsque vous le convertissez en un type String, ce que ferait le stream:out.

Vous pouvez activer le traceur de voir ce que le message contient pendant le routage http://camel.apache.org/tracer

Donc, si vous voulez vraiment diffuser: le toString du corps de message, vous devez transformer manuellement d'abord, en appelant Sa méthode toString

.transform(simple("${body.toString()}")) 
+0

Donc, c'est identique si je change la signature de bean pour retourner String et appeler return body.toString()? Et si le composant dans "to" peut fonctionner avec des objets Java, il n'y aura pas de conversation? – Eugene

+0

Oui, si votre bean retourne un String et que vous appelez 'return body.toString()', alors le 'stream: out' utilisera tel quel –

+0

Pouvez-vous nous aider à comprendre pourquoi heppens? https://stackoverflow.com/questions/46447191/cant-add-application-prop-to-camel-test – Eugene