2015-02-13 2 views
0

Я использую Apache Camel для использования некоторых файлов XML.
Проблемы заключается в том, когда он обрабатывает атрибут файла значение всегда является нулем ...
я написал несколько модульных тестов, чтобы быть Сюры моего файл XML является действительным, но верблюд все еще идет не так ...
Атрибуты unmarshall Camel XStream: null

Вот мой маршрут:

Namespaces ns = new Namespaces("ns", "http://www.vaudoise.ch/b2b/gm/interchange"); 
    from(source).marshal().string("ISO-8859-1").log("body = ${body}") 
    .setHeader("fileName").simple("${header.CamelFileRelativePath}") 
    .setHeader("lotId").xpath("//ns:documents//@T_demandeLotID", String.class, ns) 
    .setHeader("typeDoc").xpath("//ns:documents//@T_demandeTypeDoc", String.class, ns) 
    .setHeader("source").xpath("//ns:documents//@T_demandeSource", String.class, ns) 
    .setHeader("time").xpath("//ns:documents//@T_demandeTimestamp", String.class, ns) 
    .split().xpath("//ns:documents/ns:document",ns).log(" splited body = ${body}") 
    .unmarshal(new XStreamDataFormat(FichierService.getOrCreateXStream())).log("body after unmarshal ${body}") 
    .transform(method(event)).to(BATCHCORE_INJECTOR); 

FichierService.getOrCreateXStream() возвращает экземпляр XStream, как это:

public static XStream getOrCreateXStream() { 
    if (XSTREAM == null) { 
     QNameMap qname = new QNameMap(); 
     qname.setDefaultNamespace(XMLNS); 
     XmlFriendlyNameCoder replacer = new XmlFriendlyNameCoder("-", "_"); 
     StaxDriver staxDriver = new StaxDriver(qname, replacer); 
     XSTREAM = new XStream(staxDriver); 
     XSTREAM.processAnnotations(new Class[] { DocumentEnteteDto.class, 
               DocumentDto.class, 
               ReferenceDto.class, 
               ObjetMetierDto.class, 
               ObjetMetierSinistreDto.class, 
               ObjetMetierAnnonceDto.class, 
               ObjetMetierContratDto.class, 
               ObjetMetierFactureDto.class, 
               ObjetMetierMutationDto.class}); 
     XSTREAM.registerConverter(new DateConverter("yyyy-MM-dd'T'HH:mm:ss", new String[] { "yyyy-MM-dd", 
      "yyyy-MM-dd'T'HH:mm:ss" })); 
     XSTREAM.registerConverter(new JodaDateConverter()); 
     XSTREAM.registerConverter(BooleanConverter.BINARY); 
    } 
    return XSTREAM; 
    } 

Когда я иду шаг за шагом я п классы XSTREAM, я вижу, что команда Object value = converter.fromString(reader.getAttribute(attrAlias)); от метода doUnmarshall из класса AbstractReflectionConverter всегда возвращает null

Вот пример моего файла XML потреблять:

<?xml version='1.0' encoding='ISO-8859-1'?> 
<documents xmlns="http://www.xxx.yyy/b2b/gm/interchange" 
     T_demandeLotID="2" 
     T_demandeTypeDoc="Sinistre" 
     T_demandeSource="ST_PROG" 
     T_demandeTimestamp="2015-02-13T07:23:23"> 

     <document> 
      <references 
       D_refSequence="132" 
       D_refContratVA="001213456.3100" 
       D_refPreneurVA="0" 
       D_refSinistreVA="1000" 
       D_refContratGM="123-GA-456" 
       D_refPreneurGM="123456" 
       D_refSinistreGM="12345678"/> 

      <objetMetier> 
       <sinistre 
        S_sinistreEtat="S" 
        S_sinistreAcceptation="1" 
        S_sinistreDateSurv="2015-02-01" 
        S_sinistreDevise="CHF" 
        S_sinistreDescriptif="Vol d'un velo" 
        S_sinistreDateLiquidation="2015-01-01"> 

        <gestionnaire 
         S_gestionnaireNom="nom" 
         S_gestionnairePrenom="prenom" 
         S_gestionnaireTel="tel" 
         S_gestionnaireEmail="mail"/> 
       </sinistre> 
      </objetMetier> 
     </document> 
    </documents> 

ответ

0

я нашел мою проблему!

Это из-за _ в именах атрибутов ... XStream использует их как escape-символы ... Я не знаю, почему в моих модульных тестах было хорошо, но не с Camel.
Для решения этой проблемы мне пришлось создать экземпляр класса XStream. Один для маршалла и один для развязывания с другим видом XmlFriendlyNameCoder:

public static XStream getOrCreateXStreamToUnmarshall(){ 
    if(XSTREAM_TO_UNMARSHALL != null){ 
     return XSTREAM_TO_UNMARSHALL; 
    } 
    XmlFriendlyNameCoder replacer = new XmlFriendlyNameCoder("-", ""); 
    return createXStream(XSTREAM_TO_UNMARSHALL, replacer); 
    } 

    public static XStream getOrCreateXStreamToMarshall() { 
    if(XSTREAM_TO_MARSHALL != null){ 
     return XSTREAM_TO_MARSHALL; 
    } 
    XmlFriendlyNameCoder replacer = new XmlFriendlyNameCoder("-", "_"); 
    return createXStream(XSTREAM_TO_MARSHALL, replacer); 
    } 

    private static XStream createXStream(XStream xSTreamToInitialize, XmlFriendlyNameCoder encoder){ 
    QNameMap qname = new QNameMap(); 
    qname.setDefaultNamespace(XMLNS_VAUDOISE); 
    StaxDriver staxDriver = new StaxDriver(qname, encoder); 
    xSTreamToInitialize = new XStream(staxDriver); 
    xSTreamToInitialize.processAnnotations(new Class[] { DocumentEnteteDto.class, 
     DocumentDto.class, 
     ReferenceDto.class, 
     ObjetMetierDto.class, 
     ObjetMetierSinistreDto.class, 
     ObjetMetierAnnonceDto.class, 
     ObjetMetierContratDto.class, 
     ObjetMetierFactureDto.class, 
     ObjetMetierMutationDto.class}); 
    xSTreamToInitialize.registerConverter(new DateConverter("yyyy-MM-dd'T'HH:mm:ss", new String[] { "yyyy-MM-dd", 
    "yyyy-MM-dd'T'HH:mm:ss" })); 
    xSTreamToInitialize.registerConverter(new JodaDateConverter()); 
    xSTreamToInitialize.registerConverter(BooleanConverter.BINARY); 
    return xSTreamToInitialize; 
    } 
+0

У вас есть вопросы по этому вопросу, так что вы нашли решение? –

Смежные вопросы