java - 使用 Prowide-Core 生成人类可读的 SWIFT 消息?

标签 java swift-mt

我正在使用 Prowide-Core 进行 SWIFT 消息处理。目前,如果我需要将消息转储出来,我会使用 JSON 方法来生成消息的人类可读版本。这会产生如下输出:

...
}, {
  "97A" : ":SAFE//0123-0123456-55-000"
}, {
...

即我得到字段名称的字母数字代码,例如 97A

但是,我查看 Field97A.java:471 时,可以发现它(以及所有其他字段)知道它们更易读的名称(在 Qualifier 的情况下为 Account97A )。

我尝试寻找一些类似 toString() 的方法,利用这些信息来生成比 JSON 输出更具可读性的内容,但尚未找到任何内容。

SwiftMessage 或相关类之一是否有这样的方法?或者有人写了一些不错的东西,可以遍历消息并使用 getComponentLabels() 等返回的信息将其打印出来?

最佳答案

我是作者之一。为了供将来引用,在即将发布的 SRU2018 版本(计划于 10 月)中,我们修改了所有模型抽象层中的所有 JSON API。

SwiftMessage 对象中的 toJson 仍然为标签生成纯名称/值元组。但是,在 MTnnn 类中,toJson 使用 Field 生成带有业务标签的 JSON,例如:

{   "name": "90A",
    "qualifier": "DEAL",
    "percentageTypeCode": "PRCT",
    "price": "102,713552"
},
{   "name": "36B",
    "qualifier": "ESTT",
    "quantityTypeCode": "AMOR",
    "quantity": "7999999,573"
},
{   "name": "97A",
    "qualifier": "SAFE",
    "account": "0123-0123456-55formatted  
}

除了 JSON 之外,您还可以使用可用的 getLabel 和 getValueDisplay 方法迭代字段并打印格式化的名称和值。

例如:

Locale locale = Locale.getDefault();
SwiftMessage sm = SwiftMessage.parse("{1:F01BACOARB1A0B20000000000}{2:I103ADRBNL21XXXXU2}{3:{108:FOOB3926BE868XXX}}{4:\n" +
    ":20:REFERENCE\n" +
    ":23B:CRED\n" +
    ":32A:180730USD1234567,89\n" +
    ":50A:/12345678901234567890\n" +
    "CFIMHKH1XXX\n" +
    ":59:/12345678901234567890\n" +
    "JOE DOE\n" +
    "MyStreet 1234\n" +
    ":71A:OUR\n" +
    "-}");
System.out.println("Sender: " + sm.getSender());
System.out.println("Receiver: " + sm.getReceiver() + "\n");
for (Tag tag : sm.getBlock4().getTags()) {
    Field field = tag.asField();
    System.out.println(Field.getLabel(field.getName(), "103", null, locale));
    System.out.println(field.getValueDisplay(locale) + "\n");
}

将产生以下输出:

发件人:BACOARB1A0B2 接收器:ADRBNL21XXXX

Sender's Reference
REFERENCE

Bank Operation Code
CRED

Value Date/Currency/Interbank Settled Amount
Jul 30, 2018 USD 1,234,567.89

Ordering Customer
12345678901234567890 CFIMHKH1XXX

Beneficiary Customer
12345678901234567890 JOE DOE MyStreet 1234

Details of Charges
OUR

根据语言环境对组件进行拆分和格式化。 如果您还需要每个组件的标签,您可以进一步迭代组件,如下所示:

for (Tag tag : sm.getBlock4().getTags()) {
    Field field = tag.asField();
    System.out.println("\n" + Field.getLabel(field.getName(), "103", null, locale));
    for (int component = 1 ; component <= field.componentsSize() ; component++) {
        if (field.getComponent(component) != null) {
            System.out.print(field.getComponentLabel(component) + ": ");
            System.out.println(field.getValueDisplay(component, locale));
        }
    }
}

产生其他输出:

Sender's Reference
Reference: REFERENCE

Bank Operation Code
Type: CRED

Value Date/Currency/Interbank Settled Amount
Date: Jul 30, 2018
Currency: USD
Amount: 1,234,567.89

Ordering Customer
Account: 12345678901234567890
BIC: CFIMHKH1XXX

Beneficiary Customer
Account: 12345678901234567890
Name And Address: JOE DOE
Name And Address 2: MyStreet 1234

Details of Charges
Code: OUR

最后,如果您感兴趣,Prowide 的 Integrator 库包含开箱即用的打印输出访问者,可生成 HTML、TXT 和 XML,包括结构化序列和用机构信息扩展的 BIC。您可以要求 Prowide 进行试用。

关于java - 使用 Prowide-Core 生成人类可读的 SWIFT 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47265944/

相关文章:

java - 如何避免贫血数据模型?存储库可以注入(inject)实体吗?

java - AWS Java SDK 不适用于 Eclipse IDE

java - 为什么三角函数的某些值没有给出正确的答案?

financial - SWIFT ACK 报文解析

.net - .NET 的 SWIFT 消息解析

.net - 使用ASCII编码通过WebSphere MQ将消息发送到SWIFT

java - 我如何用 Java 测试互联网的可用性?

java - 关于hibernate注解的问题

java - 如何在 Prowide Core (WIFE) 中设置 MT518 swift 消息模型对象的方向

java - 使用 WIFE Java 库的 SWIFT MT 消息解析