将外部格式转换为内部格式

Convert External format to Internal format

我需要这个问题的解决方案:

我是一名服务提供商,我有几个服务客户。 每个服务客户端都以自己的格式向我发送请求,例如:

service client 1 fields are --> f1 , f2 , f3
service client 2 fields are --> f2 , f3 , f4
service client 3 fields are --> f3 , f7 , f8

他们可能会添加或删除新字段或更改其当前格式,例如 "service client 1" 组合:

 f1+f2 ==> f12 and adds f5

或客户 3 :

 decomposes f7 ---> f1,f2

我需要一个内部格式,例如:

  f1,f2,f3,f4,f5,f6,f7,f8,f9

这种格式应该是可配置的,我可以通过 xml 配置文件更改它,所以当客户端发生更改时,我通过更改 xml 来修复它而不更改源代码。

我该怎么做?

简而言之,您需要一个 API 将您的外部消息和一个“操作方法”文件交给它,它会对它产生一些魔力并向您传递内部消息。让我们关注 API 的主要职责,即消息转换。正如您提到的,它应该可以通过 XML 配置文件进行配置。我们需要一个可以称为“Field”的元素,它至少有一个我称之为“name”的属性。我将这些 Field 元素的集合包装在一个父元素中。 “Field”元素中的每一个都指定目标内部消息中的一个字段。在 Field 元素中,我想添加另一个元素,它负责收集我想要的字段并对它们执行函数。这是 XML 配置的示例:

<fields>
    <field name="aLong">
        <function name="add">
            <arg>
                <function name="readExternalField">
                    <arg>
                        f1
                    </arg>
                </function>
            </arg>
            <arg>
                <function name="readExternalField">
                    <arg>
                        f2
                    </arg>
                </function>
            </arg>
        </function>
    </field>
    <field name="aStr">
        <function name="getFromArray" index="0">
            <arg>
                <function name="splitStr" character=" ">
                    <arg>
                        <function name="readExternalField">
                            <arg>
                                f3
                            </arg>
                        </function>
                    </arg>
                </function>
            <arg>
        </function>
    </field>
</fields>

假设我们有一个内部对象,它至少有两个名为“aLong”和“aStr”的字段,还有一个外部对象,它至少有三个字段:“f1”、“f2”和“f3”。关键是我必须确保使用的函数的 return 类型可分配给目标字段。函数“add”将字段“f1”和“f2”的值相加,结果必须分配给字段“aLong”,函数“splitStr”拆分“f3”字段和returns 一个数组其中函数“getFromArray”获取数组的第一项作为结果。
我更喜欢使用 JAXB API 解组我的 XML 文件并轻松解析它,所以我们需要一个 XSD 文档,可以通过在线工具从 XML 文件生成。我建议利用基于地图的对象来消除做反射的需要。如果开发REST服务,接收到的JSON消息可以转换为地图对象。通过这种方式,您的 API 有一个方法可以接收基于地图的对象,并且 return 是相同的。因此,每个字段都是映射中的键,而不是 class 中的字段。但是函数可以有特定类型的某些参数。 API 的主体必须在将它们传递给函数之前从外部映射中转换获取的对象,并将 returned 值放入具有指定字段名称的内部消息中 XML 文件。
我希望这个简短的回答阐明了获得令人满意的解决方案的方法,并记住写出可以自豪地与同事分享的高效 API 是一种技能,只有实践才能传授给你。