在构造函数中,参数0需要一个类型为'java.lang.String'的bean,但找不到。
在构造函数中,参数0需要一个类型为'java.lang.String'的bean,但找不到。
我正在使用Spring Boot 2.X应用程序中的Spring Batch工作,实际上这是我从Git中检出的现有代码。在运行应用程序时,我遇到了以下错误,而同样的代码对其他人来说是可以工作的。
s.c.a.AnnotationConfigApplicationContext:在上下文初始化过程中遇到异常 - 取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:在文件中定义的名称为'inputItemReader'的bean创建错误[C:\ Users \ XYZ \ git \ main \ batch \ CBatchProcessing \ target \ classes \ com \ main \ batchprocessing \ batch \ reader \ InputItemReader.class]:通过构造函数参数0传达的不满足的依赖项。嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有符合条件的类型为'java.lang.String'的bean可用:至少需要1个符合自动装配候选的bean。依赖注释:{} 错误启动应用程序。要显示条件报告,请使用'--debug'选项重新运行应用程序。 2018-10-16 23:23:37.411 ERROR 2384 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter: *************************** 应用程序启动失败 *************************** 描述: com.main.batchprocessing.batch.reader.InputItemReader中构造函数的参数0需要找不到的'type'java.lang.String'的bean。 操作: 在配置中定义一个类型为'java.lang.String'的bean。
我已经检查了以下内容:
- 所有的Spring组件都正确地使用了@Component,@Service,@Controller,@Repository等注解。
- 提供了@ComponentScan和@EnableAutoConfiguration。
- 尝试在声明中给出"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
在上面的内容中,出现了一个问题,即(Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found)。出现这个问题的原因是没有提供公共的默认构造函数,并且添加了自己的非默认构造函数,导致实例化失败。建议将输入文件路径定义为属性,例如("${inputFilePath}")
。如果需要进一步初始化bean,在其内部定义一个无返回值的方法,并使用@PostConstruct
进行注释,在其中进行初始化。
另外,从Spring Boot 2.2.x开始,将支持不可变配置,并且支持属性的构造函数注入。通过提供默认构造函数解决了这个问题。
总结起来,解决(Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found)问题的方法是:
1. 提供公共的默认构造函数;
2. 将输入文件路径定义为属性;
3. 如果需要进一步初始化bean,在其中定义一个无返回值的方法,并使用@PostConstruct
进行注释,在其中进行初始化;
4. 使用Spring Boot 2.2.x及以上版本,并提供默认构造函数来支持构造函数注入。
以上就是解决(Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found)问题的原因和解决方法。