beanio映射文件中的maxLength功能不起作用



我有一个要求,需要在文件中写入一个最大长度为25的字段值。从DB我得到的长度是30。我在beanio映射文件中使用"maxLength=25"属性。它仍然允许长度大于25的值。任何人都可以提出任何解决方案或解决方法?

根据第4.6.2节"字段验证",根据我对文档的理解,对于分隔的格式,在将对象写入(编组(到OutputStream时,不可能强制BeanIO验证。强调我的。

4.6.2.现场验证

BeanIO在读取输入流。所有字段验证规则都将根据类型转换前的字段文本。当场修整被启用时,trim="true",所有验证都是在字段的文本首先进行了修剪向输出流

我想它适用于固定长度格式,否则你会有一个无效的记录(尽管同样的参数可能适用于任何格式(

这里有两个选项:

  1. 如果您想偏执,请在setter和/或getter方法中强制执行最大长度。这将影响您的整个应用程序(尽管我认为确保数据一致性是个好主意(。您可以通过各种方式在库的帮助下做到这一点(脑海中浮现的是ApacheCommonsLang的StringUtils(。我省略了任何null检查,在使用这些方法时应该注意这些检查。

    public String getFirstName() {
    return firstName.substring(0, 25); // this should really not be necessary if you use the setter
    }
    public void setFirstName(final String newFirstName) {
    firstName = newFirstName.substring(0, 25);
    }
    

    这不需要对mapping.xml文件进行任何更改。

  2. 在BeanIO显式使用的用于写入(编组(数据的替代setter和/或getter方法中强制执行最大长度。然后,您的getter/setter方法不做任何特殊的事情,而是为每个字段添加一个新的getter/set对。当您只想在写入数据时强制执行长度时,可以只使用自定义getter方法。

    public String getFirstName() {
    return firstName; 
    }
    public void setFirstName(final String newFirstName) {
    firstName = newFirstName;
    }
    // the BeanIO specific getter/setter
    public String getFirstNameBIO() {
    return firstName.substring(0, 25);
    }
    public void setFirstNameBIO(final String newFirstName) {
    firstName = newFirstName.substring(0, 25);
    }
    

    这也需要更改mapping.xml文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <beanio xmlns="http://www.beanio.org/2012/03"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">
    <stream name="DailyCasesSndStream" format="delimited" strict="true">
    <parser>
    <property name="delimiter" value="|"/>
    </parser>
    <record name="DailyCasesRecord" class="com.run.daily.batch.util.DailyCasesRecord" minOccurs="0"
    maxOccurs="unbounded">
    <field name="firstName" maxLength="25" getter="getFirstNameBIO" setter="setFirstNameBIO"/>
    <!-- OR if you only want the new getter to be used -->
    <field name="midName" maxLength="25" getter="getMidNameBIO"/>
    </record>
    </stream>
    </beanio>
    

    使用此测试代码:

    final DailyCasesRecord dailyCasesRecord = new DailyCasesRecord();
    dailyCasesRecord.setFirstName("FirstNameFirstNameFirstName");
    dailyCasesRecord.setMidNameBIO("MidNameMidNameMidNameMidName");
    final StreamFactory factory = StreamFactory.newInstance();
    factory.loadResource("mapping.xml");
    BeanWriter beanWriter = null;
    try (final StringWriter out = new StringWriter()) {
    beanWriter = factory.createWriter("DailyCasesSndStream", out);
    beanWriter.write(dailyCasesRecord);
    System.out.println(out.toString());
    } catch (final Exception e) {
    System.err.println(e.getMessage());
    } finally {
    if (beanWriter != null) {
    beanWriter.close();
    }
    }
    

    我得到这个输出:

    FirstNameFirstNameFirstNa|MidNameMidNameMidNameMidN
    

相关内容

  • 没有找到相关文章

最新更新