Проблемы с smooks

#edi #edifact #smooks

#edi #edifact #smooks

Вопрос:

В настоящее время я оцениваю smooks (www.smooks.org ). Это выглядит так же, как то, что нам нужно, но у меня возникают проблемы с получением простого примера для работы.

У меня есть скрипт ant, который загружает мне все зависимости, включая сопоставление и привязку jar для сообщений EDIFACT.

Я пытаюсь преобразовать простое сообщение EDIFACT APERAK в Java, используя их EJC (я использую JavaSE для этого небольшого теста). Преобразование завершается с ошибкой, за исключением того, что какой-то блок не ожидался (см. Ниже). Поэтому мне интересно, не пропустил ли я какую-то конфигурацию (обратите внимание на первые несколько строк в выводе журнала).

Кто-нибудь работал с EJC Smooks? Как я могу получить больше информации о том, на какую строку он жалуется?

Итак, это код:

     D00BInterchangeFactory factory = D00BInterchangeFactory.getInstance();
    File file = new File("aperak.edi");
    BufferedInputStream ediSource = new BufferedInputStream(new FileInputStream(file));
    StreamResult xmlStream = new StreamResult();
    StringWriter xmlWriter = new StringWriter();
    xmlStream.setWriter(xmlWriter);
    UNEdifactInterchange interchange = factory.fromUNEdifact(ediSource);
    //System.err.println("MEssage " xmlWriter.toString());
    if(interchange instanceof UNEdifactInterchange41){
        UNEdifactInterchange41 interchange41 = (UNEdifactInterchange41)interchange;
        for(UNEdifactMessage41 message: interchange41.getMessages()){
        Object messageObj = message.getMessage();
            System.err.println("Ref Num " message.getMessageHeader().getMessageRefNum());
        if(messageObj instanceof Aperak){
            Aperak aperak = (Aperak)message.getMessage();
            System.err.println("Aperak " aperak);
            }
        }
    }
  

Когда я запускаю его, я получаю это исключение

 02-Nov-2011 15:58:09 org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy addCDU
WARNING: ContentHandlerFactory [org.milyn.delivery.JavaContentHandlerFactory] unable to create resource processing instance for resource [Target Profile: [[*]], Selector: [cdu-creator], Selector Namespace URI: [null], Resource: [org.milyn.smooks.scripting.groovy.GroovyContentHandlerFactory], Num Params: [1]]. org/codehaus/groovy/control/CompilationFailedException
02-Nov-2011 15:58:10 org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy addCDU
WARNING: ContentHandlerFactory [org.milyn.delivery.JavaContentHandlerFactory] unable to create resource processing instance for resource [Target Profile: [[*]], Selector: [cdu-creator], Selector Namespace URI: [null], Resource: [org.milyn.smooks.scripting.groovy.GroovyContentHandlerFactory], Num Params: [1]]. org/codehaus/groovy/control/CompilationFailedException
Exception in thread "main" org.milyn.SmooksException: Failed to filter source.
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:86)
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:61)
    at org.milyn.Smooks._filter(Smooks.java:516)
    at org.milyn.Smooks.filterSource(Smooks.java:475)
    at org.milyn.Smooks.filterSource(Smooks.java:449)
    at org.milyn.edi.unedifact.d00b.D00BInterchangeFactory.fromUNEdifact(D00BInterchangeFactory.java:58)
    at org.milyn.edi.unedifact.d00b.D00BInterchangeFactory.fromUNEdifact(D00BInterchangeFactory.java:40)
    at EDITestReader.readFile(EDITestReader.java:37)
    at EDITestReader.main(EDITestReader.java:59)
Caused by: org.xml.sax.SAXException: Unknown/Unexpected UN/EDIFACT control block segment code '
UN'.
    at org.milyn.edisax.unedifact.handlers.r41.UNEdifact41ControlBlockHandlerFactory.getControlBlockHandler(UNEdifact41ControlBlockHandlerFactory.java:53)
    at org.milyn.edisax.unedifact.UNEdifactInterchangeParser.parse(UNEdifactInterchangeParser.java:95)
    at org.milyn.smooks.edi.unedifact.UNEdifactReader.parse(UNEdifactReader.java:77)
    at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:70)
    at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:75)
    ... 8 more
    enter code here
  

Фактическое сообщение EDIFACT довольно простое:

 UNA: .? '
UNB UNOC:3 IMP XXX 20110902:1024 44090560'
UNH 440905601 APERAK:D:00B:UN:IMP10'
BGM 313  9 RE'
RFF ACW:XXXXXXXXX1109020'
DTM 182:201109021018:203'
RFF BM:XXXXXXXXX'
RFF AGO:XXXXXXX1109020'
RFF EQ:XXXXXXXX'
NAD MS IMP'
CTA MS :EDI'
COM XXXXXXXXXXX:TE'
COM support@XXXXX.XX:EM'
ERC 200:IMP02:DAK'
FTX AAO   ERR4045?: Gest.datum ist mehr als 90 Tage kleiner als das Tagesdatum DE'
UNT 14 440905601'
UNZ 1 44090560'
  

Когда я удаляю ведущий сегмент UNA и UNB, появляется следующее исключение: ([APERAK][D:00B:UN] . Должно быть не менее 1 экземпляра segment [BGM]). Существует сегмент BGM, поэтому я не уверен, почему он жалуется.

 Caused by: org.milyn.edisax.EDIParseException: EDI message processing failed [APERAK][D:00B:UN].  Must be a minimum of 1 instances of segment [BGM].  Currently at segment number 2.
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:460)
    at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:411)
    at org.milyn.edisax.EDIParser.parse(EDIParser.java:387)
    at org.milyn.edisax.EDIParser.parse(EDIParser.java:371)
    at org.milyn.edisax.unedifact.handlers.r41.UNHHandler.process(UNHHandler.java:80)
    at org.milyn.edisax.unedifact.UNEdifactInterchangeParser.parse(UNEdifactInterchangeParser.java:98)
    at org.milyn.smooks.edi.unedifact.UNEdifactReader.parse(UNEdifactReader.java:77)
    at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:70)
  

Обновить:
Когда я удаляю возврат каретки из сообщения

 UNH 440905601 APERAK:D:00B:UN:IMP10'BGM 313  9 RE'RFF ACW:XXXXXXXXX1109020'DTM 182:201109021018:203'
  

он работает нормально. Но как мне заставить smooks принимать возвраты каретки и пробелы, а также два ведущих сегмента UNA / UNB? Вероятно, я пропустил какую-то часть обработки сообщений, которую обычно выполняет smooks.

ОБНОВЛЕНИЕ 2: выяснено, что поддерживаются сегменты UNA / UNB (моя ошибка), но у меня все еще возникают проблемы с возвратом каретки. Ренат предложил использовать опцию ‘ignoreNewLines’ в EDIParser. Я пробовал это, но, похоже, это ничего не меняет. Я также пытался настроить smooks с помощью этого:

 <?xml version="1.0" encoding="UTF-8"?>
    <smooks-resource-list 
    xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" 
    xmlns:edi="http://www.milyn.org/xsd/smooks/edi-1.4.xsd">
        <edi:reader mappingModel="/org/milyn/smooks/edi/xsd14/edi-to-xml-mapping.xml" ignoreNewLines="true" />
    </smooks-resource-list>
  

Снова безуспешно.

У меня такое ощущение, что D00AInterchangeFactory (или что каждая версия, которую вы используете) настраивает свой EDIParser по-разному, а ignoreNewLines игнорируется.

Есть ли способ получить EDIParser, который использует InterchangeFactory?

Ответ №1:

Вам нужно добавить переключатель «игнорировать новую строку» в EDIParser. У вас есть несколько способов сделать это, например, вы можете использовать XmlReader#setFeature()

http://download.oracle.com/javase/1.5.0/docs/api/org/xml/sax/XMLReader.html#setFeature (java.lang.Строка, boolean)

или напрямую через вызов метода EDIParser. Смотрите примеры здесь

https://gist.github.com/825845

и вот

https://gist.github.com/825843

Ренат

Комментарии:

1. Привет, Ренат, спасибо за ваш ответ. Я пробовал опцию ignoreNewLines, но, похоже, она не работает с сгенерированными EJC классами InterchnageFactory. Я попытался установить его через smooks-config.xml (<edi:модель отображения считывателя=»/org/milyn/smooks/edi/xsd14/edi-to-xml-mapping.xml » ignoreNewLines=»true» />) с помощью GenericReaderConfigurator для объекта smooks. Поскольку я не использую EDIParser напрямую, я ничего не могу на него установить. Кажется, что UNEdifactInterchangeFactory создает свой собственный EDIParser и игнорирует параметр ignoreNewLines .

2. Что вы могли бы сделать, так это изменить сгенерированный код или более прагматичный подход скопируйте сгенерированный класс для D00BInterchangeFactory и измените его в своем проекте. Как только это сработает, вы можете отправить ошибку для проекта Smooks JIRA, и, если хотите, вы можете напрямую разветвлять и исправлять шаблоны velocity, используемые для генерации кода в EJC, поэтому позже мы сделаем запрос на извлечение, исправляющий эту проблему в коде EJC.

3. Мы также используем smooks для синтаксического анализа EDIFACT внутри контейнера Karaf. Мы заметили, что повторная обработка неудачного заказа после повышения уровня журнала до уровня ОТЛАДКИ приводит к тому, что заказ проходит. Мы наблюдали такое поведение также с CSVReader.