web-dev-qa-db-fra.com

Le paramètre 0 du constructeur dans requiert un bean de type 'Java.lang.String' introuvable

Je travaille sur le lot de printemps avec l'application Spring Boot 2.X, en fait son code existant, je suis extrait de git. Lors de l'exécution de l'application, elle échoue en raison de l'erreur ci-dessous uniquement pour moi et le même code fonctionne pour les autres.

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.

J'ai vérifié ci-dessous

  1. Tous les composants Spring sont correctement annotés avec @Component, @Service, @ Controller, @ Repository, etc ...
  2. @ComponentScan & @EnableAutoCOnfiguration est également fourni.
  3. J'ai essayé de donner "Java.lang.String" dans les déclarations.

Code:

    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

Puisque vous ne fournissez pas le constructeur par défaut public et que vous avez ajouté votre propre constructeur non par défaut, l'instanciation échouera. Je vous suggère de définir le chemin du fichier d'entrée comme une propriété comme @Value("${inputFilePath}"). Si vous avez besoin d'une initialisation supplémentaire dans votre bean, définissez une méthode void et annotez-la avec @PostConstruct et faites l'initialisation à l'intérieur.

5
v_schoener

Vous avez défini quelque chose comme ceci:

@Component
public class InputItemReader{

   public InputItemReader(String input){
     ...
   }
}

Le nom de votre classe suggère que votre objet n'est pas un bean, juste un simple objet. Vous devriez essayer de l'utiliser de manière classique:

new InputItemReader(myString);

ou d'avoir une méthode statique pour traiter la chaîne d'entrée.

Explication: le conteneur Spring IoC essaiera d'instancier un nouvel objet InputItemReader comme ceci:

new InputItemReader( -- WHAT TO PUT HERE? --) 

et échouera à appeler votre constructeur, car il ne saura pas ce que vous attendez réellement et ne saisira pas de chaîne.

MISE À JOUR: Votre problème peut être résolu en supprimant l'annotation @Component et en définissant le bean dans une configuration comme celle-ci:

@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

Ajoutez un constructeur public par défaut dans votre classe. Par exemple.

public User() {
}
1
vkstream