BeanIO写入0而不是预期值

时间:2017-11-28 11:59:06

标签: java bean-io

我有一个包含记录计数器的固定长度流

  • 记录以Z
  • 开头
  • 字符16 + 9(人形)包含B record counter
  • 字符25 + 9(人形)包含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

我的导出代码有什么问题?为什么我总是零?

2 个答案:

答案 0 :(得分:0)

来自Section 4.3.1

中的最后一段
  

可选地,format属性可用于传递java.lang.Number类型的十进制格式,以及传递java.util.Date类型的日期格式。在下面的示例中,hireDate字段使用SimpleDateFormat模式“yyyy-MM-dd”,而salary字段使用DecimalFormat模式“#,## 0”。有关支持的模式的更多信息,请参阅Java的java.text.DecimalFormat和java.text.SimpleDateFormat类的API文档。

并在Section 4.3.2

  

可以使用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属性