私は、Spring Boot 2.XアプリケーションでSpring Batchに取り組んでいます。実際には、既存のコードをgitからチェックアウトしています。アプリケーションを実行している間、私だけの以下のエラーのために失敗し、同じコードが他の人のために働いています。
s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'inputItemReader' defined in file [C:\Users\XYZ\git\main\batch\CBatchProcessing\target\classes\com\main\batchprocessing\batch\reader\InputItemReader.class]: Unsatisfied dependency expressed through **constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'Java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations**: {}
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-10-16 23:23:37.411 ERROR 2384 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
**Parameter 0 of constructor in com.main.batchprocessing.batch.reader.InputItemReader required a bean of type 'Java.lang.String' that could not be found.**
Action:
Consider defining a bean of type 'Java.lang.String' in your configuration.
私は以下をチェックしました
コード:
import Java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.JsonLineMapper;
import
org.springframework.batch.item.file.separator.JsonRecordSeparatorPolicy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;
@Component
public class InputItemReader extends FlatFileItemReader<Map<String,
Object>> implements StepExecutionListener {
@Autowired
private InputFileHeaderValidator inputFileHeaderValidator;
@Autowired
private FileAuditService fileAuditService;
private final Logger log =
LoggerFactory.getLogger(InputItemReader.class);
private Java.lang.String inputFilePath;
public InputItemReader(String inputFilePath) {
setLineMapper(new JsonLineMapper());
setRecordSeparatorPolicy(new JsonRecordSeparatorPolicy());
setResource(new FileSystemResource(inputFilePath));
this.inputFilePath = inputFilePath;
}
}
パブリックなデフォルトコンストラクタを提供せず、独自のデフォルト以外のコンストラクタを追加したため、インスタンス化は失敗します。入力ファイルのパスを@Value("${inputFilePath}")
のようなプロパティとして定義することをお勧めします。 Beanでさらに初期化が必要な場合は、voidメソッドを定義し、@PostConstruct
アノテーションを付けて、内部で初期化を行います。
次のように定義しました:
@Component
public class InputItemReader{
public InputItemReader(String input){
...
}
}
クラスの名前は、オブジェクトがBeanではなく、単なるオブジェクトであることを示唆しています。あなたは古典的な方法でそれを使用してみてください:
new InputItemReader(myString);
または、入力文字列を処理する静的メソッドが必要です。
説明:Spring IoCコンテナーは、次のような新しいInputItemReaderオブジェクトのインスタンス化を試みます。
new InputItemReader( -- WHAT TO PUT HERE? --)
実際に何を期待し、文字列を入力するのかわからないため、コンストラクタの呼び出しに失敗します。
更新:この問題は、@ Componentアノテーションを削除し、次のような構成でBeanを定義することで解決できます。
@Bean
public InputItemReader inputItemReader(InputFileHeaderValidator inputFileHeaderValidator, FileAuditService fileAuditService){
InputItemReader inputItemReader = new InputItemReader("--HERE SHOULD BE ACTUAL PATH---");
// set the required service, a cleaner approach would be to send them via constructor
inputItemReader.setFilteAuditService(fileAuditService);
inputItemReader.setInputFileHeaderValidator(inputFileHeaderValidator);
return inputItemReader;
}
クラスにpublic default constructorを追加します。例えば。
public User() {
}