还没有使用BeanIO。我试图从CSV文件中读取一个简单的字符串列表,如下所示:
AA11
BB22
CC33A
4D33L
beanio.org上最简单的例子是使用带字段的对象。我不需要那个。我想要的只是读取字符串。
我拥有什么
的 1。 XSLT优惠券
<beanio xmlns="http://www.beanio.org/2012/03">
<stream name="coupons" format="csv">
<parser>
<property name="delimiter" value="," />
<property name="lineSeparator" value="\n" />
<property name="whitespaceAllowed" value="true" />
</parser>
<record name="header" class="map" maxOccurs="1">
<field name="recordType" rid="true" literal="H" />
<field name="fileDate" type="date" format="yyyy-MM-dd" />
</record>
<record name="detail" minOccurs="0" maxOccurs="1" class="java.lang.String" />
</stream>
</beanio>
2。 CouponProcessor.java
public class CouponProcessor {
public Map<String, Boolean> readCouponCodesFromCSV(InputStream couponCsv) throws Exception {
StreamFactory factory = StreamFactory.newInstance();
factory.loadResource("/coupon_codes/coupon.xml"); // ** Problem occurs here **
BeanReader in = factory.createReader("coupons", new InputStreamReader(couponCsv));
Object record = null;
Map<String, Boolean> couponCodeMap = new TreeMap<>();
while ((record = in.read()) != null) {
switch (in.getRecordName()) {
case "header" :
@SuppressWarnings("unchecked")
Map<String, Object> header = (Map<String,Object>) record;
log.info(header.get("fileDate"));
break;
case "detail" :
String code = (String) record;
couponCodeMap.put(code, couponCodeMap.get(code) == null ? Boolean.FALSE : Boolean.TRUE); // False='unique', True='duplicate'
}
}
in.close();
return couponCodeMap;
}
}
第3。遇到的问题
这一行
factory.loadResource("/coupon_codes/coupon.xml");
我收到以下错误:
CouponProcessor.readCouponCodesFromCSV(java.io.InputStream) throws java.lang.Exception: javax.ejb.EJBException: org.beanio.BeanIOConfigurationException: Invalid record 'detail', in stream 'coupons': Repeating segments without any child field component must have minOccurs=maxOccurs
的 4。问题
Q1。使用beanio可以在没有用户定义的对象的情况下映射基元/包装器和字符串吗?
Q2。造成上述问题的原因是什么?
Q3。如何解决这个问题?什么是最合适的解决方案?
感谢。