0

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

  • 记录以Z
  • 字符 16+9(人形)包含B record counter
  • 字符 25+9(人形)包含C record counter
  • 所有数字都用右边填充0并对齐
  • A记录在位置 1898 以+结尾CRLF(记录长 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

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

4

2 回答 2

0

第 4.3.1 节的最后一段

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

第 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;
 }

希望这可以帮助。

于 2017-11-28T14:31:38.360 回答
0

发现了罪人。自定义类型处理程序!!!!

根据BeanIO

类型处理程序可以使用 name 属性显式命名,和/或通过设置 type 属性为特定类型的所有字段注册。type 属性可以设置为类型处理程序支持的类的完全限定类名或类型别名。要引用命名类型处理程序,请在配置字段时使用 typeHandler 字段属性。

所以我没有在我的文件的标题中显示我已经注册了大量的自定义类型处理程序,不幸的是它们都带有一个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属性有效

于 2017-11-28T15:38:34.190 回答