我有一个需求,我需要在字段中将字段值写入最大长度为25的文件。从DB中获取长度为30。我在beanio映射文件中使用'maxLength = 25'属性。允许长度大于25的值。有人可以建议相同的任何解决方案或解决方法吗?
答案 0 :(得分:0)
根据Section 4.6.2 Field Validation,根据我对文档的理解,以定界格式将对象编组(编组)到OutputStream
对象时,不可能强制BeanIO验证。强调我的。
4.6.2。现场验证
BeanIO在阅读以下内容时支持几种常见的字段验证规则: 输入流。所有字段验证规则均根据 类型转换之前输入字段文本。启用字段微调后, trim =“ true”,所有验证均在字段文本包含 首先修剪。 在写入 输出流。
我想它适用于定长格式,否则您的记录将无效(尽管相同的参数可能适用于任何格式)
您在这里有2个选择:
如果想变得偏执,请在您的setter和/或getter方法中增加最大长度。这将影响您的整个应用程序(尽管我认为确保数据一致性是一个好主意)。您可以通过各种方式并借助库来完成此操作(请想到Apache Commons Lang的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
文件进行任何更改。
使用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