Проблемы с пятнами

76
6

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


У меня есть ant script, который загружает мне все зависимости, включая сопоставления и привязки для сообщений 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 экземпляра сегмента [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)

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


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

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


ОБНОВЛЕНИЕ 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 по-другому и игнорируетNewLines игнорируется.


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

спросил(а) 2011-11-02T19:19:00+04:00 8 лет, 8 месяцев назад
1
Решение
66

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


http://download.oracle.com/javase/1.5.0/docs/api/org/xml/sax/XMLReader.html#setFeature(java.lang.String,%20boolean)


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


https://gist.github.com/825845

и здесь


https://gist.github.com/825843


Ренат

ответил(а) 2011-11-03T18:27:00+04:00 8 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема