在构造函数中,参数0需要一个类型为'java.lang.String'的bean,但找不到。

7 浏览
0 Comments

在构造函数中,参数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。

我已经检查了以下内容:

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

0
0 Comments

问题原因:在构造函数的参数中需要一个类型为java.lang.String的bean,但是找不到这个bean。

解决方法:确保你使用了spring-boot-starter-data-jpa,并在maven依赖中指定了版本号。可以参考spring-boot bom来获取正确的版本号。同时,在回答问题时,尽可能提供更多的上下文信息,例如在问题中没有指定maven依赖的版本号,可以明确说明如果没有使用bom,则需要指定版本号。可以参考stackoverflow.com/help/how-to-answer中的"Answer the question"小节,为问题提供上下文信息。

0
0 Comments

在出现(Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found)这个问题时,原因是缺少一个公共的默认构造函数。解决方法是在类中添加一个公共的默认构造函数。

如果你使用的是Lombok,你可以在类的顶部添加注解@NoArgsConstructor

0
0 Comments

在上面的内容中,出现了一个问题,即(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)问题的原因和解决方法。

0