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
- Todos los componentes de Spring están correctamente anotados con @Component, @Service, @Controller, @Repository, etc…
- También se proporciona @ComponentScan y @EnableAutoCOnfiguration.
- 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;
}
}
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.
-
Sí, esta es la respuesta… En application.properties faltaba la variable inputFilePath… @v_schoener gracias…
– Ganesha
29 de octubre de 2018 a las 9:41
-
Por cierto, desde Spring Boot 2.2.x se admitirá la configuración inmutable y, por lo tanto, se admitirá la inyección de constructor de las propiedades. github.com/spring-projects/spring-boot/commit/…, https://github.com/spring-projects/spring-boot/wiki/…, https://github.com/spring-projects/spring-boot/wiki/…
– Brice
17 de julio de 2019 a las 12:59
-
Gracias, simplemente resuelva el problema proporcionando un constructor predeterminado.
–Ornelio Chauque
29 sep 2021 a las 19:46
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
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;
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 {
...
}
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
¿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