El parámetro 0 del constructor requiere un bean de tipo ‘java.lang.String’ que no se pudo encontrar

6 minutos de lectura

Avatar de usuario de Ganesh
Ganesh

Estoy trabajando en el lote de primavera con la aplicación spring boot 2.X, en realidad, su código existente lo he extraído de git. Mientras ejecuta la aplicación, falla debido al siguiente error solo para mí y el mismo código funciona para otros.

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.

He comprobado a continuación

  1. Todos los componentes de Spring están correctamente anotados con @Component, @Service, @Controller, @Repository, etc…
  2. También se proporciona @ComponentScan y @EnableAutoCOnfiguration.
  3. Intenté dar “java.lang.String” en las declaraciones.

Código:

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

  • ¿Puedes agregar el código para InputItemReader?

    – Gaurav Srivastav

    16 oct 2018 a las 18:17

  • Esto puede ayudar: stackoverflow.com/questions/51064214/…

    – Dakshinamurthy Karra

    16 oct 2018 a las 18:18

  • hay algunos artículos con mensajes de error similares: stackoverflow.com/questions/44058210/…

    – Joseph

    16 oct 2018 a las 18:19

  • @joseph: Gracias por los enlaces, pero he probado todos estos… Codificaré fragmentos

    – Ganesha

    16 oct 2018 a las 18:46

  • Lea ¿Bajo qué circunstancias puedo agregar “urgente” u otras frases similares a mi pregunta para obtener respuestas más rápidas? – el resumen es que esta no es una forma ideal de dirigirse a los voluntarios, y probablemente sea contraproducente para obtener respuestas. Por favor, absténgase de agregar esto a sus preguntas.

    – mitad

    16 oct 2018 a las 19:51

avatar de usuario de schoener
schoener

Dado que no proporciona el constructor predeterminado público y agregó su propio constructor no predeterminado, la creación de instancias fallará. Le sugiero que defina la ruta del archivo de entrada como propiedad como @Value("${inputFilePath}"). Si necesita más inicialización en su bean, defina un método vacío y anótelo con @PostConstruct y hacer la inicialización dentro.

Agrega un constructor predeterminado público en tu clase. Por ejemplo.

public User() {
}

  • Gracias por compartirlo. Esto me ayudó a resolver el problema en mi proyecto. Estoy un poco confundido. Muchas de mis clases de servicio no tienen un constructor público, incluso entonces puedo crear un bean con el constructor personalizado. Pero comencé a tener un problema con una clase de servicio donde se resolvió al proporcionar un constructor predeterminado. Estoy creando un bean a partir de la clase de configuración donde el valor de los parámetros se obtiene del archivo de propiedades.

    – aprendiz

    18 mayo 2021 a las 20:22


  • Si está utilizando Lombok, puede agregar una anotación (@NoArgsConstructor) encima de la clase.

    – vkstream

    18 de diciembre de 2021 a las 3:38

Asegúrese de estar usando spring-boot-starter-data-jpa

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

  • Siempre es bueno proporcionar tanto contexto como sea posible. Por ejemplo, aquí no está especificando una versión en la dependencia maven. Puede ampliar el bom de arranque de resorte, por ejemplo, e indicar que se podría requerir una versión si no se usa el boms. Este es solo un ejemplo. Siempre es bueno tratar de proporcionar al menos algo de contexto si es posible. Consulte aquí stackoverflow.com/help/how-to-answer específicamente bajo el subtítulo “Responda la pregunta”

    – Nigel Savage

    26 de enero de 2020 a las 17:47

Avatar de usuario de Adina Rolea
Adina Rolea

Usted definió algo como esto:

@Component
public class InputItemReader{

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

El nombre de su clase sugiere que su objeto no es un frijol, solo un objeto simple. Deberías intentar usarlo de forma clásica:

new InputItemReader(myString);

o tener un método estático para procesar la cadena de entrada.

Explicación: el contenedor Spring IoC intentará crear una instancia de un nuevo objeto InputItemReader como este:

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

y no podrá llamar a su constructor, porque no sabrá lo que realmente espera y la cadena de entrada.

ACTUALIZACIÓN: su problema se puede resolver eliminando la anotación @Component y definiendo el bean en una configuración como esta:

@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;
}

Para mí, fue por usar la anotación @AllArgsConstructor del lombok. Mi código era así:

@Service
@AllArgsConstructor
public class SampleService {

    @Value("${search.page.size}")
    private Integer pageSize;

    private final SampleRepository sampleRepository;

Y luego, eliminé @AllArgsConstructor y agregué la anotación @RequiredArgsConstructor. El problema fue resuelto.

@Service
@RequiredArgsConstructor
public class SampleService {

    @Value("${search.page.size}")
    private Integer pageSize;

    private final BatchRepository batchRepository;

Avatar de usuario de Julien Nowak
Julien Nowak

Tuve el mismo error pero el error fue generado por fingir cliente. Si tiene este error al usar fingir cliente, debe agregar @EnableFeignClients en tu clase principal:

@SpringCloudApplication
@EnableFeignClients
public class Application {
...
}

Avatar de usuario de Ricardo
ricardo

También tuve el mismo error:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field repository in com.example.controller.CampaignController required a bean of type 'com.example.data.CustomerRepository' that could not be found.


Action:

Consider defining a bean of type 'com.example.data.CustomerRepository' in your configuration.de here

Resolví este problema agregando @EnableMongoRepositories anotación en la clase principal:

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {

    public static void main(String[] args) {
        SpringApplication.run(CampaignAPI.class, args);
    }
}

  • ¡buena atrapada! esto resolvió mi problema. Sin embargo, ¿es mejor agregar todos los repositorios así? basePackageClasses = Foo1Repository.class, Foo2Repository.class... ?

    – Zap

    17 de agosto de 2021 a las 12:07

¿Ha sido útil esta solución?