【问题标题】:Problems with smooks烟雾问题
【发布时间】:2011-12-20 11:42:09
【问题描述】:

我目前正在评估 smooks (www.smooks.org)。它看起来就像我们需要的一样,但我在让一个简单的例子工作时遇到了问题。

我有一个 ant 脚本,它可以下载所有依赖项,包括 EDIFACT 消息的映射和绑定 jar。

我正在尝试使用他们的 EJC 将简单的 EDIFACT APERAK 消息转换为 Java(我正在使用 JavaSE 进行这个小测试)。 转换失败,但出现了一些不期望出现的块(见下文)。所以我想知道我是否缺少一些配置(注意日志输出中的前几行)。

有人与 Smooks 的 EJC 合作过吗?我如何才能获得有关它所抱怨的线路的更多信息?

代码如下:

    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)

更新: 当我从消息中删除回车时

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 段(我的错误),但我仍然遇到回车问题。 Renat 建议在 EDIParser 上使用“ignoreNewLines”选项。我已经尝试过了,但似乎没有什么不同。我也试过用这个来配置 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。

有没有办法获取 InterchangeFactory 正在使用的 EDIParser?

【问题讨论】:

    标签: edi edifact smooks


    【解决方案1】:

    您需要在 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

    再生

    【讨论】:

    • 嗨 Renat,感谢您的回答。我尝试了 ignoreNewLines 选项,但它似乎不适用于 EJC 生成的 InterchnageFactory 类。我尝试通过 smooks-config.xml () 设置它smooks 对象上的 GenericReaderConfigurator。因为我不直接使用 EDIParser,所以我不能在上面设置任何东西。似乎 UNEdifactInterchangeFactory 创建了自己的 EDIParser 并忽略了 ignoreNewLines 选项。
    • 您可以做的是更改生成的代码,或者更实用的方法复制 D00BInterchangeFactory 生成的类并在您的项目中更改它。一旦它可以工作,您可以为 Smooks JIRA 项目提交一个错误,如果您愿意,您可以直接 fork 和修补用于 EJC 中代码生成的速度模板,因此稍后我们将提出修复该问题的拉取请求到 EJC 代码中。
    • 我们还使用 smooks 来解析 Karaf 容器内的 EDIFACT。我们注意到,在将日志级别提升到 DEBUG 后重新处理失败的订单会使订单通过。我们也使用 CSVReader 观察到了这种行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2012-09-13
    • 2013-03-09
    • 2019-10-10
    相关资源
    最近更新 更多