如何为Smooks中UNEdifactInterchange41对象添加UNH头实现MSCONS导出?
解决Smooks生成MSCONS时添加UNH头的问题
我之前在使用Smooks的UN/EDIFACT D16B库生成MSCONS消息时,也碰到过同样的困惑——UNB是整个交换的头,而UNH是单个消息的头,不能直接加到UNEdifactInterchange41对象上,得和具体的MSCONS消息绑定。下面是具体的实现步骤和完整代码示例:
核心思路
UNH(Message Header)属于每个独立的EDIFACT消息(这里就是MSCONS),所以需要:
- 创建
UNH41对象并设置必要属性(消息编号、类型、版本等) - 将
UNH41关联到MSCONS的MessageHeader中 - 把带UNH头的MSCONS消息添加到Interchange里
完整代码示例
import org.milyn.edi.unedifact.d16b.D16BInterchangeFactory; import org.milyn.edi.unedifact.d16b.MSCONS.MSCONS; import org.milyn.edi.unedifact.d16b.MSCONS.MessageHeader; import org.milyn.smooks.edi.unedifact.model.r41.UNB41; import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41; import org.milyn.smooks.edi.unedifact.model.r41.UNH41; import java.io.IOException; import java.io.StringWriter; public class MSCONSGenerator { public static void main(String[] args) throws IOException { // 初始化D16B交换工厂 D16BInterchangeFactory interchangeFactory = D16BInterchangeFactory.getInstance(); // 构建UNB交换头(你已经实现的部分,这里补充示例) UNB41 unbHeader = new UNB41(); unbHeader.setSyntaxIdentifier("UNOC"); unbHeader.setSyntaxVersionNumber("3"); unbHeader.setSenderIdentification("YOUR_SENDER_ID"); unbHeader.setRecipientIdentification("TARGET_RECEIVER_ID"); unbHeader.setDateOfPreparation("240520"); // 格式:YYMMDD unbHeader.setTimeOfPreparation("1430"); // 格式:HHMM // 创建交换对象并绑定UNB头 UNEdifactInterchange41 interchange = new UNEdifactInterchange41(); interchange.setUnb(unbHeader); // -------------------------- // 重点:构建MSCONS消息并添加UNH头 // -------------------------- MSCONS msconsMessage = new MSCONS(); // 创建UNH消息头 UNH41 unhHeader = new UNH41(); unhHeader.setMessageReferenceNumber("MSCONS_0001"); // 唯一消息编号,自定义 // 对应D16B版本的MSCONS消息标识 unhHeader.setMessageTypeIdentifier("MSCONS"); unhHeader.setMessageTypeVersionNumber("D"); unhHeader.setMessageTypeReleaseNumber("16B"); unhHeader.setControllingAgencyCoded("UN"); unhHeader.setAssociationAssignedCode(""); // 无特殊需求可留空 // 将UNH绑定到MSCONS的MessageHeader MessageHeader msconsMsgHeader = new MessageHeader(); msconsMsgHeader.setUNH41(unhHeader); msconsMessage.setMessageHeader(msconsMsgHeader); // -------------------------- // 补充MSCONS的业务数据(比如能源值相关字段) // -------------------------- // 这里根据你的业务需求添加具体的Segment,例如: // - 能源计量数量(QTY段) // - 日期时间(DTM段) // - 产品信息(LIN段) // ... // 将MSCONS消息添加到交换对象 interchange.addMessage(msconsMessage); // 生成最终的EDIFACT字符串 StringWriter outputWriter = new StringWriter(); interchangeFactory.write(interchange, outputWriter); // 输出结果 System.out.println("生成的MSCONS EDIFACT内容:"); System.out.println(outputWriter.toString()); } }
关键注意事项
- UNH的唯一性:如果在同一个Interchange里添加多个MSCONS消息,每个消息的
MessageReferenceNumber必须唯一。 - 版本匹配:UNH里的
MessageTypeVersionNumber和MessageTypeReleaseNumber必须和你使用的D16B版本对应,不能写错,否则接收方会解析失败。 - 必填字段:除了UNH,MSCONS本身还有很多必填Segment(比如能源值对应的QTY、相关的DTM等),需要根据业务需求补充完整,不然生成的文件不符合MSCONS标准。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

