1

这与我所拥有的类似:

@CsvRecord(separator = "\\t", skipFirstLine = true)
public class Inventory {

    @DataField(pos = 1, required=false)
    private String vendor;

    @DataField(pos = 2, required=false)
    private String sku;

    @DataField(pos = 3, required=false)
    private Integer stock;
}

如果第 2 列或第 3 列为空,则根本没有问题,这些字段只有一个空值(假设 -> 是选项卡表示)。

VENDOR->SKU->STOCK
Vendor1->123->5
Vendor1->->10

具有绑定结果,例如

[{
    vendor: "Vendor1",
    sku: "123",
    stock: 5
},
{
    vendor: "Vendor1",
    sku: null,
    stock: 10
}]

到目前为止,一切都很好,但是当第一列为空时,binder 将第 2 列值(sku)分配给第 1 列绑定属性“vendor”,并将第 3 列值分配给第 2 列绑定属性( sku),绑定到第 3 列的实际属性保持为空:

VENDOR->SKU->STOCK
null->123->5
Vendor1->166->10

做这样的事情:

[{
    vendor: "123",
    sku: "5",
    stock: null
},
{
    vendor: "Vendor1",
    sku: "166",
    stock: 10
}]

我知道我总是可以让它“required=true”(这就是它最初的做法),但如果第二个不为空,它仍然不会失败,因为那个被分配给第一个;另一方面,在我们的例子中,做列要求为真,这不是一个好主意,因为因为一行丢失了一些东西,整个文件被拒绝,所以我们的策略是手动验证那些对我们来说是强制性的字段,所以我们可以正确记录并处理所有列中正确的行。

这是我对这个库的依赖:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-bindy</artifactId>
    <version>2.11.1</version>
</dependency>

这将是绑定库的名称:

camel-bindy-2.11.1.jar

我检查了 CsvRecord 注释和 DataField 注释中的所有属性,盲目地尝试了其中一些属性,希望能解决它。

有谁知道为什么会发生这种情况?或者如果它是在更高版本中解决的库问题?或者我可以尝试的任何建议?

当然,我提前感谢我能得到的任何帮助或答案!

4

0 回答 0