簡體   English   中英

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

[英]maxLength feature in beanio mapping file is not working

我有一個需要在其中將字段值寫到最大長度為25的文件上的要求。從數據庫中,我得到的長度為30。我在bean映射文件中使用了“ maxLength = 25”屬性。長度大於25。有人可以建議任何解決方案或解決方法嗎?

根據第4.6.2節“字段驗證” ,根據我對文檔的理解,在將對象寫入(編組)對象到OutputStream定界格式時,不可能強制進行BeanIO驗證。 強調我的。

4.6.2。 現場驗證

讀取輸入流時,BeanIO支持幾種常見的字段驗證規則。 在類型轉換之前,將針對字段文本驗證所有字段驗證規則。 啟用字段修剪功能,trim =“ true”時,將在第一次修剪字段的文本后執行所有驗證。 寫入輸出流時,將忽略字段驗證。

我猜想它適用於定長格式,否則您將獲得無效的記錄(盡管相同的參數可能適用於任何格式)

您在這里有2個選項:

  1. 如果您想偏執,請在您的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文件進行任何更改。

  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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM