잘 정리해보자

Spring Batch Error : Writer must be open before it can be written to 본문

Spring/Spring Boot

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

 

Improve documentation in regards to the return type of reader/writer bean definition methods · Issue #1502 · spring-projects/s

Simon Wong opened BATCH-2097 and commented SO related questions: https://stackoverflow.com/questions/43043554/spring-batch-writernotopenexception https://stackoverflow.com/questions/23847661/spring...

github.com

 

@Bean 참고 : https://renuevo.github.io/spring/batch/spring-batch-chapter-1/

 

[Spring] 1. Spring Batch의 기본 개념

Spring Batch Guide 시리즈 Spring Batch의 기본 개념 Spring Batch의 ItemReader - File Item Reader Spring Batch의 ItemReader - DB Item Reader Chapter 1에서는 Spring Batch의 구조와 동작 방식의 대한 이야기를 다룹니다 Spring의 DI

renuevo.github.io

 

Comments