2

私はHeaderColumnNameMappingStrategyを使用して、ヘッダー付きのcsvファイルをJavaBeanにマップしています。文字列値は正常に解析されますが、csvの「true」または「false」値はJavaBeanにマップされず、PropertyDescriptorから次の例外が発生します。

java.lang.IllegalArgumentException: argument type mismatch

それが発生するコードは、CsvToBeanの64行目にあります。

protected T processLine(MappingStrategy<T> mapper, String[] line) throws  
 IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
    T bean = mapper.createBean();
    for(int col = 0; col < line.length; col++) {
        String value = line[col];
        PropertyDescriptor prop = mapper.findDescriptor(col);
        if (null != prop) {
            Object obj = convertValue(value, prop);
            // this is where exception is thrown for a "true" value in csv
            prop.getWriteMethod().invoke(bean, new Object[] {obj});
        }
    }
    return bean;
}

 protected PropertyEditor getPropertyEditor(PropertyDescriptor desc) throws   
       InstantiationException, IllegalAccessException {
    Class<?> cls = desc.getPropertyEditorClass();
    if (null != cls) return (PropertyEditor) cls.newInstance();
    return getPropertyEditorValue(desc.getPropertyType());
}

この時点で、setterメソッドIDが正しく取得されたことを(デバッガーを介して)確認できます。

nullを返すため、desc.getPropertyEditorClass()で問題が発生します。プリミティブ型とそのラッパーがサポートされていると仮定しました。そうじゃないの?

4

3 に答える 3

5

私はこの同じ問題に遭遇しました。おそらく最もクリーンな方法は、上記の pritam のように getPropertyEditor をオーバーライドし、特定のオブジェクトのカスタム PropertyEditor を返すことです。手っ取り早い方法は、convertValue を匿名クラス形式でオーバーライドすることです。次のようにします。

CsvToBean<MyClass> csvToBean = new CsvToBean<MyClass>(){

    @Override
    protected Object convertValue(String value, PropertyDescriptor prop) throws InstantiationException,IllegalAccessException {

        if (prop.getName().equals("myWhatever")) {
            // return an custom object based on the incoming value
            return new MyWhatever((String)value);
        }

        return super.convertValue(value, prop);
    }
};

これは、OpenCSV 2.3 でうまく機能しています。幸運を!

于 2012-09-13T21:09:51.733 に答える