0

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

4

1 回答 1

0

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

4.6.2. 字段验证

BeanIO 在读取输入流时支持几种常见的字段验证规则。在类型转换之前,所有字段验证规则都会根据字段文本进行验证。启用字段修剪时,trim="true",所有验证都在字段文本首次修剪后执行。写入输出流时忽略字段验证。

我猜它适用于固定长度格式,否则您将获得无效记录(尽管相同的论点可能适用于任何格式)

您在这里有 2 个选项:

  1. 如果您想偏执,请在您的 setter 和/或 getter 方法中强制执行最大长度。这将影响您的整个应用程序(尽管我认为确保数据一致性是个好主意)。您可以通过各种方式并借助库(StringUtils想到 Apache Commons Lang)来完成此操作。我省略了任何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/setter 对。当您只想在写入数据时强制执行长度时,您可以只使用自定义 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
    
于 2018-07-18T13:30:22.797 回答