gpt4 book ai didi

java - 以编程方式将 csv 映射到 smooks 中的 java 无法处理空的 Double

转载 作者:行者123 更新时间:2023-11-30 09:41:34 25 4
gpt4 key购买 nike

我正在使用 smooks 库快速轻松地解析 csv 文件,以编程方式将它们映射到 POJO。但是我在处理 POJO 的 Double 属性上的空字段时遇到了麻烦。例如java对象有:

public class MulticashHeader {

// ...
private Double c06;
private static Double c07;
private Double c08;
private Double c09;
private String c10;
// ...
public Double getC06_SaldoInicial() {
return c06_SaldoInicial;
}
/**
* @param c06_SaldoInicial the c06_SaldoInicial to set
*/
public void setC06_SaldoInicial(Double c06_SaldoInicial) {
if (c06_SaldoInicial != null)
this.c06_SaldoInicial = c06_SaldoInicial;
}
public void setC06_SaldoInicial(String c06_SaldoInicial) {
if (c06_SaldoInicial != null && !"".equals(c06_SaldoInicial.trim()) ) {
this.c06_SaldoInicial = new Double(c06_SaldoInicial.trim());
} else {
this.c06_SaldoInicial = Double.valueOf("0");
}
}
/**
* @return the c07_TotalDebitos
*/
public Double getC07_TotalDebitos() {
return c07_TotalDebitos;
}
/**
* @param c07_TotalDebitos the c07_TotalDebitos to set
*/
public void setC07_TotalDebitos(Double c07_TotalDebitos) {
MulticashEncabezado.c07_TotalDebitos = c07_TotalDebitos;
}
public void setC07_TotalDebitos(String c07_TotalDebitos) {
if (c07_TotalDebitos != null && !"".equals(c07_TotalDebitos.trim()) ) {
MulticashEncabezado.c07_TotalDebitos = new Double(c07_TotalDebitos.trim());
} else {
MulticashEncabezado.c07_TotalDebitos = Double.valueOf("0");
}
}
/**
* @return the c08_TotalCreditos
*/
public Double getC08_TotalCreditos() {
return c08_TotalCreditos;
}
/**
* @param c08_TotalCreditos the c08_TotalCreditos to set
*/
public void setC08_TotalCreditos(Double c08_TotalCreditos) {
if (c08_TotalCreditos != null)
this.c08_TotalCreditos = c08_TotalCreditos;
}
public void setC08_TotalCreditos(String c08_TotalCreditos) {
if (c08_TotalCreditos != null && !"".equals(c08_TotalCreditos.trim()) ) {
this.c08_TotalCreditos = new Double( c08_TotalCreditos.trim() );
} else {
this.c08_TotalCreditos = Double.valueOf("0");
}
}
// ...
}

smoks 映射是这样的:

private static final char CchrSeparator = ';';
// File mapping
private static final String CMulticashHeader = "c01_ClaveBanco,c02_Cuenta,c03_Consecutivo,c04_FechaMovimientos,c05_ClaveMoneda,c06_SaldoInicial,c07_TotalDebitos,"+
"c08_TotalCreditos,c09_SaldoFinal,c10_TipoCuenta,c11,c12,c13,c14,c15,c16,c17,c18_NumeroMovs";
smooks.setReaderConfig( new CSVReaderConfigurator( CMulticashHeader ).setBinding( new CSVBinding(
"balanceList", MulticashHeader.class, CSVBindingType.LIST )).setSeparatorChar(CchrSeparator) );

但是当处理一个 c_06、c_07、c_08 和 c_09 为空值的文件时(不只是零而且是空的),这些值恰好是 Double 值,即使在 POJO 的属性 setter 上设置函数重载也不起作用并抛出

Unable to filter InputStream for target profile [org.milyn.profile.Profile#default_profile].
org.milyn.SmooksException: Unable to filter InputStream for target profile [org.milyn.profile.Profile#default_profile].
at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:294)
at org.milyn.delivery.dom.SmooksDOMFilter.doFilter(SmooksDOMFilter.java:243)
at org.milyn.delivery.dom.SmooksDOMFilter.doFilter(SmooksDOMFilter.java:216)
at org.milyn.Smooks._filter(Smooks.java:516)
at org.milyn.Smooks.filterSource(Smooks.java:475)
at com.example.CSVParserServicio.runSmooksTransform(CSVParserServicio.java:98)
...
Caused by: org.milyn.javabean.DataDecodeException: Failed to decode binding value '' for property 'c07_TotalDebitos' on bean '9b06d0eb-9231-
4c49-a612-75ace2b5d44c'.
at org.milyn.javabean.BeanInstancePopulator.decodeDataString(BeanInstancePopulator.java:581)
at org.milyn.javabean.BeanInstancePopulator.decodeAndSetPropertyValue(BeanInstancePopulator.java:482)
at org.milyn.javabean.BeanInstancePopulator.bindDomDataValue(BeanInstancePopulator.java:384)
at org.milyn.javabean.BeanInstancePopulator.visitAfter(BeanInstancePopulator.java:319)
at org.milyn.delivery.dom.SmooksDOMFilter$ElementProcessor.processMapping(SmooksDOMFilter.java:778)
at org.milyn.delivery.dom.SmooksDOMFilter$ElementProcessor.process(SmooksDOMFilter.java:717)
at org.milyn.delivery.dom.SmooksDOMFilter$ElementProcessor.access$000(SmooksDOMFilter.java:666)
at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:385)
at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:317)
at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:292)
... 27 more
Caused by: org.milyn.javabean.DataDecodeException: Failed to decode Double value ''.
at org.milyn.javabean.decoders.DoubleDecoder.decode(DoubleDecoder.java:34)
at org.milyn.javabean.BeanInstancePopulator.decodeDataString(BeanInstancePopulator.java:579)
... 36 more
Caused by: java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:992)
at java.lang.Double.parseDouble(Double.java:510)
at org.milyn.javabean.decoders.DoubleDecoder.decode(DoubleDecoder.java:32)
... 37 more

有人知道如何避免这种保持程序化方法的陷阱吗?

----------------编辑----------------:我正在从 csv 到 java 的 smooks 示例中测试这个,使用 Tom 所说的配置 xml。我有这个错误复制:

<?xml version="1.0"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:csv1="http://www.milyn.org/xsd/smooks/csv-1.3.xsd">

<csv1:reader fields="firstName,lastName,gender,age,country" separator=";">
<csv1:listBinding beanId="customerList" class="example.Customer"/>
</csv1:reader>

</smooks-resource-list>

文件是

charles;moulliard;Male;43;belgium
maxence;dewil;Male;;belgium
eleonor;moulliard;Female;12;belgium

(注意空龄)。而java主类是

private static String messageIn = readInputMessage();

Smooks smooks = new Smooks("/route/to/smooks-config.xml");

try {
ExecutionContext executionContext = smooks.createExecutionContext();
JavaResult result = new JavaResult();
smooks.filterSource(executionContext, new StringSource(messageIn), result);
return (List) result.getBean("customerList");
} finally {
smooks.close();
}
...

我发现这是 Tom 的例子 (!!!),所以我问:如何使用 <jb:bean> 将 csv 字段映射到 POJO 属性?

---------------- EDIT2 ----------------:我尝试了在 codehaus 的 JIRA 线程中找到的一些东西,我得到了以下配置文件:

<?xml version="1.0"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:csv1="http://www.milyn.org/xsd/smooks/csv-1.3.xsd"
xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.1.xsd">

<csv1:reader fields="firstName,lastName,gender,age,country" separator=";" />

<jb:bindings beanId="customer" class="example.Customer" createOnElement="csv-record">
<jb:value property="firstName" data="csv-record/firstName" />
<jb:value property="lastName" data="csv-record/lastName" />
<jb:value property="gender" data="csv-record/gender" />
<jb:value property="age" data="csv-record/age" decoder="Integer" default="0" />
<jb:value property="country" data="csv-record/country" />
</jb:bindings>

<jb:bindings beanId="customerList" class="java.util.ArrayList" createOnElement="csv-set">
<jb:wiring beanIdRef="customer" />
</jb:bindings>

</smooks-resource-list>

它可以使用 CSV 和之前显示的空整数(年龄),但是当我将 javabean xsd 更新到 1.1 以上时它会失败。抛出错误

Exception in thread "main" org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'jb:bindings'. One of '{"http://www.milyn.org/xsd/smooks-1.1.xsd":abstract-reader, "http://www.milyn.org/xsd/smooks-1.1.xsd":abstract-resource-config}' is expected

¿我错过了什么吗?

最佳答案

您在那里使用 CSV 速记绑定(bind)机制,它不允许您指定默认值。我认为您的选择将是...

  1. 修改 CSVBinding 代码以满足您的需求。
  2. 使用一种更详细的配置机制,即 xml <jb:bean> configsprogrammatic config .这些中的任何一个都可以让您指定一个默认值。

关于java - 以编程方式将 csv 映射到 smooks 中的 java 无法处理空的 Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com