我有一个包含记录计数器的固定长度流
Z
B record counter
C record counter
0
并与右侧对齐A
+ CRLF
在1898位结束(记录长2000字符)遵循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>
豆
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
我的导出代码有什么问题?为什么我总是零?
答案 0 :(得分:0)
可选地,format属性可用于传递java.lang.Number类型的十进制格式,以及传递java.util.Date类型的日期格式。在下面的示例中,hireDate字段使用SimpleDateFormat模式“yyyy-MM-dd”,而salary字段使用DecimalFormat模式“#,## 0”。有关支持的模式的更多信息,请参阅Java的java.text.DecimalFormat和java.text.SimpleDateFormat类的API文档。
可以使用name属性显式命名类型处理程序,和/或通过设置type属性为特定类型的所有字段注册。 type属性可以设置为类型处理程序支持的类的完全限定类名或类型别名。要引用命名类型处理程序,请在配置字段时使用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;
}
希望这有帮助。
答案 1 :(得分:0)
发现有罪。自定义类型处理程序!!!!
根据BeanIO
可以使用name属性显式命名类型处理程序,和/或通过设置type属性为特定类型的所有字段注册。 type属性可以设置为类型处理程序支持的类的完全限定类名或类型别名。要引用命名类型处理程序,请在配置字段时使用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
属性