60.2.3. 3.DataField
DataField 注解定义字段的属性。每个数据字段都由其在记录中的位置标识、类型(字符串、int、date、…)以及模式(可选)。
| 注解名称 | 记录类型 | 级别 |
|---|---|---|
| DataField | all | 属性 |
| 参数名称 | 类型 | 必填 | 默认值 | info |
|---|---|---|---|---|
| pos | int | ✓ | 输入记录中数据的位置,必须从 1 开始(必需)。查看 position 参数。 | |
| align | 字符串 | R | 将文本与右侧或左对齐。使用值 <tt>R</tt> 或 <tt>L</tt>。 | |
| Clip | 布尔值 | false | 如果在使用固定长度时超过允许的长度,则指示在字段中允许的数据。 | |
| columnName | 字符串 |
标头列的名称(可选)。将属性的名称用作默认值。仅在 | ||
| decimalSeparator | 字符串 | 用于 BigDecimal 数字的十进制 Separator | ||
| defaultValue | 字符串 | 如果没有设置值,则字段的默认值 | ||
| delimiter | 字符串 | 如果字段有变量长度,则使用可选分隔符 | ||
| groupingSeparator | 字符串 | 当我们将 Separator 分组到要与 BigDecimal 号一起使用的 Separator,使用分组,例如 123,456.789 | ||
| impliedDecimalSeparator | 布尔值 | false | 指明是否有十进制点代表在指定位置 | |
| length | int | 0 | 如果记录设置为固定长度,则数据块的长度(字符数) | |
| lengthPos | int | 0 | 在记录中标识定义此字段预期的固定长度的 data 字段 | |
| 方法 | 字符串 | 在 DataField 上调用以应用此类自定义的方法名称。这必须是 datafield 本身的方法,或者您必须提供类方法的静态完全限定名称,如:请参阅单元测试 org.apache.camel.dataformat.bindy.csv.BindySimpleCsvFunctionWithExternalMethodTest.replaceToBar | ||
| name | 字符串 | 字段的名称(可选) | ||
| paddingChar | char | 如果记录被设置为固定长度,则带有 char to pad | ||
| pattern | 字符串 | Java 格式化器(例如 simpleDateFormat)的模式,它将用于转换数据(可选)。如果使用模式,则建议在绑定数据格式中设置 locale。设置为已知区域设置,如 "us" 或 "default" 来使用平台默认区域设置。 | ||
| position | int | 0 | 生成输出消息中的字段位置(应该从 1 开始)。在 CSV 生成的字段的位置(输出消息)的位置必须与输入位置(pos)不同时,必须使用。请参阅 pos 参数。 | |
| 精度 | int | 0 | 要创建的 \{@link java.math.BigDecimal} 号 | |
| required | 布尔值 | false | 指明字段是否强制 | |
| rounding | 字符串 | CEILING | round 模式用于舍入/scale a BigDecimal Values : UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN,HALF_EVEN, UNNECESSARY e.g : Number = 123456.789, Precision = 2, Rounding = CEILING Result: 123456.79. | |
| timezone | 字符串 | 要使用的时区。 | ||
| trim | 布尔值 | false | 指明值是否应该修剪 |
问题单 1:pos
此参数/attribute 代表 CSV 记录中字段的位置。
position
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
}
如本例中所示,位置从 1 开始,但在类 Order 中继续 5。从 2 到 4 的数字在类客户端中定义(请参阅之后)。
在另一个模型类中继续
public class Client {
@DataField(pos = 2)
private String clientNr;
@DataField(pos = 3)
private String firstName;
@DataField(pos = 4)
private String lastName;
}
问题单 2:模式
模式允许增强或验证数据的格式
pattern
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
// pattern used during parsing or when the date is created
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}
案例 3:精度
当您要定义数字的十进制部分时,精度很有用。
精度
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@Link
private Client client;
@DataField(pos = 5)
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
@DataField(pos = 7, precision = 2)
private BigDecimal amount;
@DataField(pos = 8)
private String currency;
@DataField(pos = 9, pattern = "dd-MM-yyyy")
private Date orderDate;
}
问题单 4:位置在输出中有所不同
position 属性将通知如何将字段放在 CSV 记录中。默认情况下,所用的位置与通过属性 pos 定义的位置对应。如果位置不同(这意味着我们有一个身份统计进程与 unmarshaling 的比较),那么我们可以使用 位置 来指明这一点。
下面是一个示例:
在输出中位置不同
@CsvRecord(separator = ",", isOrdered = true)
public class Order {
// Positions of the fields start from 1 and not from 0
@DataField(pos = 1, position = 11)
private int orderNr;
@DataField(pos = 2, position = 10)
private String clientNr;
@DataField(pos = 3, position = 9)
private String firstName;
@DataField(pos = 4, position = 8)
private String lastName;
@DataField(pos = 5, position = 7)
private String instrumentCode;
@DataField(pos = 6, position = 6)
private String instrumentNumber;
}
注释 @DataField 的此属性必须与注释 @CsvRecord 的 attribute isOrdered = true 结合使用。
问题单 5:必需
如果某个字段是必需的,只需使用 所需的 属性设为 true。
必填
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2, required = true)
private String clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, required = true)
private String lastName;
}
如果记录中没有此字段,解析器将使用以下信息引发错误:
Some fields are missing (optional or mandatory), line :
问题单 6:修剪
如果字段在处理前应该删除的前导和/或尾随空格,只需使用属性 trim 设为 true。
Trim
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1, trim = true)
private int orderNr;
@DataField(pos = 2, trim = true)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4)
private String lastName;
}
case 7 : defaultValue
如果未定义字段,则使用 defaultValue 属性指示的值。
默认值
@CsvRecord(separator = ",")
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 2)
private Integer clientNr;
@DataField(pos = 3, required = true)
private String firstName;
@DataField(pos = 4, defaultValue = "Barin")
private String lastName;
}
case 8 : columnName
仅在 @CsvRecord 具有注解 generateHeaderColumns = true 时指定属性的列名称。
列名称
@CsvRecord(separator = ",", generateHeaderColumns = true)
public class Order {
@DataField(pos = 1)
private int orderNr;
@DataField(pos = 5, columnName = "ISIN")
private String isinCode;
@DataField(name = "Name", pos = 6)
private String instrumentName;
}
此属性仅适用于可选字段。