我正在尝试映射固定长度的消息,该消息可能根据另一个字段中的值具有不同的段?
例如:
<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"段映射邮件。它要么简单,要么完整。
根据我对用户手册的了解和理解,您所要求的是不可能的。
我看到简单映射和完整映射之间的区别只是完整映射的额外最后 2 个字段。我的建议是只在mapping.xml
文件中包含完整映射的详细信息,并将最后 2 个字段(country
和phone
(设为可选。这仍然允许您完全读取平面文件并填充对象。然后,我会在阅读文件后遍历对象图,然后可能会根据枚举的值将FullAddress
对象拆分为Address
和FullAddress
对象。
这完全取决于您的用例以及您对使用它的代码和流程的控制。如果您能详细说明所涉及的其他因素,我们也许可以找到另一种解决方案。
编辑:您可以考虑的唯一选择是为您的细分使用内联map
。但它仍然需要一些后处理来确定它是Simple
地址还是Full
地址。请参阅重复句段文档,尤其是Sec 4.5.2.1 Inline Maps