잘 정리해보자
Spring Batch Error : Writer must be open before it can be written to 본문
Spring Batch Error : Writer must be open before it can be written to
토마토오이 2022. 1. 23. 01:20에러 메시지
: org.springframework.batch.item.WriterNotOpenException: Writer must be open before it can be written to
원인
: ItemWriter 구현시, csv파일을 write하는 작업에서 발생한 에러.
@Bean 과 @StepScope으로 ItemWriter<>을 구현하고 FlatFileItemWriter로 리턴하는게 원인이었다.
@Bean
@StepScope
public ItemWriter<vo> writer() throws Exception{
BeanWrapperFieldExtractor<vo> extractor = new BeanWrapperFieldExtractor();
...
DelimitedLineAggregator<vo> lineAggreator = new DelimitedLineAggregator<>();
return new FlatFileItemWriter<vo>();
}
return은 FlatFileItemWriter로 하고 선언타입은 ItemWriter였다.
원래라면 ItemWriter는 ItemStream으로 리턴되어도 상관없지만, 위에 @Bean과 @StepScope를 같이 사용해서 Bean이 proxy로 설정되어 FlatFileItemWriter에서 지원하는 open() 메서드가 동작을 안하게 되어 발생되는 문제.
해결방법
:
1. csv파일을 write 해주는 객체 FlatFileItemWriter로 리턴해야 하는 경우, 똑같이 반환타입을 맞춘다.
@Bean
@StepScope
public FlatFileItemWriter<vo> writer() throws Exception{
BeanWrapperFieldExtractor<vo> extractor = new BeanWrapperFieldExtractor();
...
DelimitedLineAggregator<vo> lineAggreator = new DelimitedLineAggregator<>();
return new FlatFileItemWriter<vo>();
}
2. ItemWriter로 반환하려면 @Bean이나 @StepScope 둘 중 하나를 삭제한다. (proxy 로 지정되는 부분을 삭제)
@Bean
public ItemWriter<vo> writer() throws Exception{
...
return new FlatFileItemWriter<vo>();
}
@StepScope
public ItemWriter<vo> writer() throws Exception{
...
return new FlatFileItemWriter<vo>();
}
애초에 반환타입 잘못 선언한 이유이기에 1번으로 처리했다.
에러사항 참고 : https://github.com/spring-projects/spring-batch/issues/1502
@Bean 참고 : https://renuevo.github.io/spring/batch/spring-batch-chapter-1/
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot - log 설정 (0) | 2022.02.08 |
---|---|
Spring Boot Error : Failed to configure a DataSource (0) | 2022.01.24 |
Spring Batch - csv파일 읽기 (FlatFileItemReader) (0) | 2022.01.21 |
Spring Batch Error : TransientDataAccessResourceException : Batch Execution Errorsdetails;Cannot change the ExecutorType when there is an existing transaction (0) | 2022.01.19 |
Spring Batch - Tasklet, Chunk 간단 비교 (0) | 2022.01.13 |