我想映射一个固定长度的消息,这个消息可能会根据另一个字段的值而有不同的分段。
例如:在这个例子中,我需要映射一个固定长度的消息,而这个消息可能会根据另一个字段的值而有不同的分段。
<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 "段来映射消息。要么是Simple要么是Full。
根据我对用户手册的了解和认识,你的要求是不可能的。
我看到简单映射和完整映射之间的区别是只有最后两个字段是完整映射的额外内容。我的建议是在您的 "简单 "映射中只包含 "完整映射 "的细节。mapping.xml
文件,并将最后2个字段(country
和 phone
) 可选。这仍然允许你完全读取平面文件并填充你的对象。在读取文件后,我将遍历对象图,然后也许会拆分 FullAddress
的对象进入 Address
和 FullAddress
基于枚举值的对象。
这在很大程度上取决于你的用例,以及你对代码和使用过程的控制。如果你能详细说明所涉及的其他因素,我们或许可以得到另一种解决方案。
EDIT:你可以考虑的唯一的替代方案是使用一个内联的 map
为您的段。但还是需要进行一些后期处理,以确定它是否是一个 Simple
或 Full
地址。见 重复的部分 文件,特别是 Sec 4.5.2.1 Inline Maps