web-dev-qa-db-ja.com

コンストラクターのパラメーター0には、見つからないタイプ 'Java.lang.String'のBeanが必要です

私は、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.

私は以下をチェックしました

  1. すべてのSpringコンポーネントには、@ Component、@ Service、@ Controller、@ Repositoryなどの注釈が正しく付けられています...
  2. @ComponentScanおよび@EnableAutoCOnfigurationも提供されます。
  3. 宣言に「Java.lang.String」を指定してみました。

コード:

    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;
    }
   }
6
Ganesh

パブリックなデフォルトコンストラクタを提供せず、独自のデフォルト以外のコンストラクタを追加したため、インスタンス化は失敗します。入力ファイルのパスを@Value("${inputFilePath}")のようなプロパティとして定義することをお勧めします。 Beanでさらに初期化が必要な場合は、voidメソッドを定義し、@PostConstructアノテーションを付けて、内部で初期化を行います。

5
v_schoener

次のように定義しました:

@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;
}
2
Adina Fometescu

クラスにpublic default constructorを追加します。例えば。

public User() {
}
1
vkstream