首页 > 解决方案 > beanio 是否可以根据另一个字段中的条件值支持动态分段?

问题描述

我正在尝试映射固定长度的消息,这些消息可能具有不同的段,具体取决于另一个字段中的值?

例如:

  <stream name="employeeFile" format="csv">
    <record name="employee" class="example.Employee">
      <field name="firstName" length="10" />
      <field name="lastName" length="10" />
      <field name="title" length="10" />
      <field name="salary" length="6" padding="0" justify="right" />
      <field name="hireDate" length="8" format="MMddyyyy" />
      <field name="segmentEnum" length="10" />
      <segment name="mailingAddressSimple" class="example.Address">
        <field name="street" length="50" />
        <field name="city" length="20" />
        <field name="state" length="2" />
        <field name="zip" length="5" />
      </segment>
      <segment name="mailingAddressFull" class="example.FullAddress">
        <field name="street" length="30" />
        <field name="state" length="2" />
        <field name="city" length="20" />
        <field name="zip" length="5" />
        <field name="country" length="10" />
        <field name="phone" length="10" />
      </segment>
    </record>
  </stream>
</beanio>

在此示例中,我将需要根据 segmentEnum 值映射具有动态段的固定长度消息。当segmentEnum 值为“Simple”时,使用段“mailingAddressSimple”映射字符串,但当值为“Full”时,使用“mailingAddressFull”段映射消息。它是简单的或完整的。

标签: segmentbean-iofixed-length-record

解决方案


根据我对用户手册的了解和理解,您所问的内容是不可能的。

我看到简单映射和完整映射之间的区别只是完整映射的最后两个字段。我的建议是仅在mapping.xml文件中包含完整映射的详细信息,并使最后 2 个字段 (countryphone) 可选。这仍然允许您完全读取平面文件并填充您的对象。然后,我会在读取文件后遍历对象图,然后根据枚举的值将FullAddress对象拆分为Address和对象。FullAddress

这完全取决于您的用例以及您对使用它的代码和流程的控制。如果您可以详细说明所涉及的其他因素,我们也许可以找到另一个解决方案。

编辑: 您可以考虑的唯一选择是map为您的细分使用内联。但是它仍然需要一些后期处理来确定它是一个地址Simple还是Full地址。请参阅重复段文档,尤其是Sec 4.5.2.1 Inline Maps


推荐阅读