i有一个固定长度流,包含记录计数器
- 记录以
Z
开头 - 字符16 9(人类形式)包含
B record counter
- 字符25 9(人类形式)包含
C record counter
- 所有用
0
填充的数字并与右侧对齐 - 记录以
A
CRLF
在1898的位置结束(记录是Long 2000 Chars)
遵循beanio映射代码
<record name="RECORD_Z" class="com.acme.ftt2017.RecordZ" order="4" minOccurs="1" maxOccurs="1" maxLength="1900">
<field name="tipoRecord" rid="true" at="0" ignore="true" required="true" length="1" lazy="true" literal="Z" />
<field name="numeroRecordB" at="15" length="9" padding="0" align="right" trim="true" />
<field name="numeroRecordC" at="24" length="9" padding="0" align="right" trim="true" />
<field name="terminatorA" at="1897" length="1" rid="true" literal="A" ignore="true" />
</record>
bean
public class RecordZ implements Serializable
{
private final char tipoRecord = 'Z';
private Integer numeroRecordB, numeroRecordC;
// G & S omitted
}
我在调试中进行了三次检查以下代码:
RecordZ trailer = new RecordZ();
trailer.setNumeroRecordB(1);
trailer.setNumeroRecordC(countRecordC); // equals 1 in debug
log.debug("Exporting record Z");
log.trace("Record Z: " + trailer.toString());
exporter.write(FttRecordTypes.RECORDTYPE_FTT_Z, trailer);
但是,产生的数据文件包含以下
Z 000000000000000000 A
预期
Z 000000001000000001 A
我的导出代码有什么问题?为什么我总是零?
从第4.3.1节的最后一段
可选地,可以使用格式属性来传递java.lang.number类型的小数十进制格式,并用于传递Java.util.date类型的日期格式。在下面的示例中,Hiredate字段使用SimpleDateFormat模式" yyyy-mm-dd",而薪水字段则使用Demalformat模式"#,## 0"。有关支持模式的更多信息,请参考Java Java.text.decimalformat和Java.text.simpledateformat类的API文档。
和第4.3.2节
可以使用名称属性明确命名类型处理程序,并且通过设置类型属性为特定类型的所有字段注册。可以将类型属性设置为类型处理程序支持的类的完全合格的类名称或类型的别名。要引用命名类型处理程序,请在配置字段时使用TypeHandler字段属性。
因此,您可以尝试两件事之一:
删除自定义*IntegerTypeHandlers
的使用,并在使用这些自定义类型处理程序的字段上指定format
属性。根据您拥有的字段和类型处理程序的数量,这可能是很多工作。例如:
<field name="numeroRecordB" format="000000000" at="15" length="9" padding="0" align="right" trim="true" />
或
使getType()
方法返回null
,而不是您的自定义类型处理程序中的Integer.class
,希望这将不被用作全局类型处理程序。我以前从未做过,所以它可能行不通。
public Class<?> getType() {
return null;
}
希望这会有所帮助。
发现有罪。自定义类型处理程序!!!!
根据beanio
可以使用名称属性明确命名类型处理程序,并且通过设置类型属性为特定类型的所有字段注册。可以将类型属性设置为类型处理程序支持的类的完全合格的类名称或类型的别名。要引用命名类型处理程序,请在配置字段时使用TypeHandler字段属性。
所以我没有显示在文件的标题中,我已经注册了自定义类型处理程序的 plenties ,不幸的是,所有这些都带有type
属性。
<typeHandler name="int_2" type="java.lang.Integer" class="org.beanio.types.IntFixedLengthTypeHandler">
<property name="numberOfDigits" value="2" />
</typeHandler>
<typeHandler name="int_4" type="java.lang.Integer" class="org.beanio.types.IntFixedLengthTypeHandler">
<property name="numberOfDigits" value="2" />
</typeHandler>
<typeHandler name="int_10" type="java.lang.Integer" class="org.beanio.types.IntFixedLengthTypeHandler">
<property name="numberOfDigits" value="10" />
</typeHandler>
<typeHandler name="bigint_16" type="java.math.BigInteger" class="org.beanio.types.BigIntFixedLengthTypeHandler">
<property name="numberOfDigits" value="16" />
</typeHandler>
删除type
属性works