【问题标题】:Smooks: Outputting EDI from JavaSmooks:从 Java 输出 EDI
【发布时间】:2015-09-13 04:30:03
【问题描述】:

Smooks EDI writer 中建议的解决方案的启发,我有以下 Java 代码:

// Creates minimal EDI message with one field populated
EdifactV3D98AMEDPID edi = new EdifactV3D98AMEDPID();
UNBInterchangeHeader header = new UNBInterchangeHeader();
UNBInterchangeHeader.S002SenderIdentification s002SenderIdentification = new UNBInterchangeHeader.S002SenderIdentification();
s002SenderIdentification.setE0004SenderIdentification("TEST");
header.setS002SenderIdentification(s002SenderIdentification);
edi.setUNBInterchangeHeader(header);

Smooks smooks = new Smooks("edi-output-smooks-config.xml");

// Sets up access to exports specified in Smooks config
ExecutionContext executionContext = smooks.createExecutionContext();
Exports exports = Exports.getExports(smooks.getApplicationContext());
Result[] results = exports.createResults();

smooks.filterSource(executionContext, new JavaSource(edi), results);

List<Object> objects = Exports.extractResults(results, exports);
JavaResult.ResultMap map = (JavaResult.ResultMap) objects.get(0);

D98AInterchangeFactory factory = D98AInterchangeFactory.getInstance();
UNEdifactInterchange41 unEdifactInterchange = (UNEdifactInterchange41) map.get("unEdifactInterchange");

// Should output EDI message as String, but StringWriter is empty
StringWriter ediOutStream = new StringWriter();
factory.toUNEdifact(unEdifactInterchange, ediOutStream);

... 使用以下 Smooks 配置:

<?xml version="1.0" encoding="UTF-8"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
                  xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.4.xsd">

    <!-- Imports D98A Edifact binding found in Maven dependency -->
    <import file="/org/milyn/edi/unedifact/d98a/message-bindingconfig.xml" />
    <import file="/org/milyn/smooks/edi/unedifact/model/r41/bindings/unedifact-interchange.xml" />

    <!-- Configures Result object for accessing EDI output -->
    <core:exports>
        <core:result type="org.milyn.payload.JavaResult"/>
    </core:exports>

</smooks-resource-list>

StringWriter 返回一个空字符串,而我曾希望/期望 Java 对象为 EDI 字符串。

有什么建议或指点吗?

【问题讨论】:

  • 我在 maven 中找不到这些类:EdifactV3D98AMEDPID,UNBInterchangeHeader。你知道包还是依赖?
  • 我在 github 上找到了它们 -> github.com/smooks/unedifact 我必须检查 unedifact 项目并构建 d98a 模块。
  • org.milyn.edi.unedifactd98a-binding1.4
  • 我创建了一个测试,它从文件中读取 EDI,然后将 EDI 正确输出为字符串。所以我认为我的问题与我在上面创建的 EDI 有关。填写单个字段可能不足以创建有效的 EDI。

标签: java edi smooks


【解决方案1】:

我没有找到 EdifactV3D98AMEDPID、UNBInterchangeHeade 类。但我做了一个类似的测试:

UNEdifactInterchange41 edi = new UNEdifactInterchange41();
UNB41 header = new UNB41();
header.setSender(null);
Party sender = new Party();
sender.setInternalId("TEST");
header.setSender(sender);
edi.setInterchangeHeader(header);

Smooks smooks = new Smooks("edi-output-smooks-config.xml");

ExecutionContext executionContext = smooks.createExecutionContext();
Exports exports = Exports.getExports(smooks.getApplicationContext());
Result[] results = exports.createResults();

smooks.filterSource(executionContext, new JavaSource(edi), results);

List<Object> objects = Exports.extractResults(results, exports);
JavaResult.ResultMap map = (JavaResult.ResultMap) objects.get(0);

D98AInterchangeFactory factory = D98AInterchangeFactory.getInstance();
UNEdifactInterchange41 u = (UNEdifactInterchange41) map.get("unEdifactInterchange");

// Should output EDI message as String, but StringWriter is empty
StringWriter ediOutStream1 = new StringWriter();
factory.toUNEdifact(u, ediOutStream1);

我得到了同样的结果,最后是一个空字符串。

但我认为问题在于您对烟雾的使用。我只将 smooks 与 Apache Camel 一起使用,所以我不知道这是否是在 smooks 中进行转换的正确方法,但我认为在这种情况下你不必调用 smook,你的输入是一个对象 EDI,你想要以 EDI 格式打印您的对象。

你唯一需要做的就是:

UNEdifactInterchange41 edi = new UNEdifactInterchange41();
UNB41 header = new UNB41();
header.setSender(null);
Party sender = new Party();
sender.setInternalId("TEST");
header.setSender(sender);
edi.setInterchangeHeader(header);

D98AInterchangeFactory factory = D98AInterchangeFactory.getInstance();

StringWriter ediOutStream1 = new StringWriter();
factory.toUNEdifact(edi, ediOutStream1);

我已经测试过了,你得到了这个:

UNB++::TEST'

希望对你有帮助

【讨论】:

  • 我也在通过 Apache Camel 使用 Smooks。你的例子也适用于我 - 所以我会从这里继续。感谢您的努力!
  • 没问题,很高兴为您提供帮助:)
  • 很棒的东西,伙计们......很高兴看到人们仍然从中获得价值:)
  • 嗨@Panchitoboy 你能帮我处理 835 edi 文件吗,我该如何解析我的 edi 文件。
  • @Panchitoboy 我是新手,对配置部分没有足够的了解
猜你喜欢
  • 2012-09-29
  • 2014-09-20
  • 2012-03-14
  • 2018-02-10
  • 2012-03-04
  • 2012-04-20
  • 2012-03-04
  • 2017-06-26
  • 2016-06-14
相关资源
最近更新 更多