Мне нужно иметь возможность прочитать файл CSV
с динамическим размером.Я не знаю заранее, сколько столбцов будет иметь мой CSV-файл.1) На первом этапе пакетной обработки мне нужно прочитать файл и преобразовать записи плоских линий в объект HashMap.Я пытаюсь достичь этого путем создания специального считывателя, который подклассов класса FlatFileItemReader.
2) Идея состоит в том, чтобы на этапе обработки преобразовать плоскую карту, полученную из reader (), в объектный граф Map object,и наконец
3) превратить этот граф объектов в запрос, который будет отправлен в API (а не сохранен в БД)
Самый первый шаг выдает:
"NotWritablePropertyException: Неверное свойство 'StrategyType' класса бина [java.util.HashMap]: "
Насколько я понимаю, исключение имеет место, поскольку HashMap действительно не имеет свойства с именем" StrategyType ".
Кто-нибудь пытался разобраться с подобной проблемой?
Как лучше подходить к решению описанной проблемы?
До сих пор я пытался реализовать свой собственный читатель, но подумал, что 'Я бы не стал изобретать велосипед, если бы Spring-Batch предоставил инструменты для этого.
public static BatchFileReader createBatchFileReader(String fileName) throws IOException
{
...
batchFileReader.setLineMapper(batchFileReader.getLineMapper(fileName));
Resource fileResource = new FileSystemResource(fileName);
batchFileReader.setResource(fileResource);
return batchFileReader;
}
...
private LineMapper<Map<String, Object>> getLineMapper(String fileName) throws FileNotFoundException, IOException
{
DefaultLineMapper<Map<String, Object>> lineMapper = new DefaultLineMapper<>();
LineTokenizer lineTokenizer = getLineTokenizer(fileName);
...
return lineMapper;
}
...
private String[] getFieldNames(InputStream fileStream) throws FileNotFoundException, IOException
{
...
return fieldNames;
}
Я ожидаю, что читатель вернется с Картой, содержащейДанные из файла CSV.
Вместо этого выдается исключение:
org.springframework.batch.item.file.FlatFileParseException: Ошибка синтаксического анализа в строке: 2 в resource = [файл [/workspaces/smart-gateway/smart-api-gateway/src/test/resources/test-data/singleRowBatchFile.csv]], вход = [SINGLE, SMS, 447855901971] в org.springframework.batch.item.file.FlatFileItemReader..java: 52) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessor.javjjlang.reflect.Method.invoke (Method.java:498) в org.junit.runners.model.FrameworkMethod $1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExavahod (Framework)в org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) в org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:26) в org.junit.runners.Parent.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78) в org.junit.runners.BlockJUnit4ClassRunner.rlass57.junjj4 ()ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:28jit) или в.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:89) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.run (TestExecution.run (TestExecution.run):41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:541) по адресу org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests: удаленный оператор org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:463) вorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:209) Вызывается: org.springframework.beans.NotWritablePropertyException: недопустимое свойство 'StrategyType' класса бобов [java.util.H:свойство 'StrategyType' недоступно для записи или имеет недопустимый метод установки.Соответствует ли тип параметра установщика типу возвращаемого значения получателя?на org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException (BeanWrapperImpl.java:243) в org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty (AbstractNestablePropertyAccessor.java:426) в org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue (AbstractNestablePropertyAccessor.java:278) в org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue (AbstractNestablePropertyAccessor.java:266) в org.springframework.beans.AbstractPropertyAccessor.setPropertyValues (AbstractPropertyAccessor.848) в org.springframework.validation.DataBinder.doBind (DataBinder.java:744) в org.springframework.validation.DataBinder.bind (DataBinder.java:729) в org.springframework.batch.item.file.mapping.BeanWrapperField.mapFieldSet (BeanWrapperFieldSetMapper.java:198) в org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine (DefaultLineMapper.java:43) в org.springframework.batch.item.file.FlatFileItemReader.doRead (FlatFileItemReader.java:180) ... еще 26