构造函数中的参数0需要找不到类型为'java.lang.String'的bean

时间:2018-10-16 18:13:43

标签: java spring-boot spring-batch spring-annotations

我正在使用Spring Boot 2.X应用程序进行Spring Batch,实际上我已经从git中检出了它的现有代码。在运行该应用程序时,由于以下错误而导致的失败仅对我自己,而相同的代码对其他人也有效。

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.

我已经检查了以下

  1. 所有Spring组件均已正确标注@ Component,@ Service,@ Controller,@ Repository等...
  2. 还提供了@ComponentScan和@EnableAutoCOnguration。
  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<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;
    }
   }

12 个答案:

答案 0 :(得分:5)

确保您使用的是spring-boot-starter-data-jpa

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

答案 1 :(得分:2)

由于您没有提供公共默认构造函数,而是添加了自己的非默认构造函数,因此实例化将失败。我建议您将输入文件路径定义为@Value("${inputFilePath}")之类的属性。 如果您需要在bean中进行进一步的初始化,请定义一个void方法并用@PostConstruct进行注释,然后在其中进行初始化。

答案 2 :(得分:1)

您定义了以下内容:

@Component
public class InputItemReader{

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

类的名称表明您的对象不是bean,而只是一个简单的对象。您应该尝试以经典方式使用它:

new InputItemReader(myString);

或具有用于处理输入String的静态方法。

说明:Spring IoC容器将尝试像这样实例化一个新的InputItemReader对象:

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

并且将无法调用您的构造函数,因为它将不知道您实际期望什么并输入字符串。

更新:    您可以通过删除@Component注释并在如下配置中定义Bean来解决您的问题:

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

答案 3 :(得分:1)

我遇到了同样的错误,但该错误是由 Feign Client 生成的。如果您在使用 feign client 时遇到此错误,则必须在主类中添加 @EnableFeignClients

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

答案 4 :(得分:0)

在您的课程中添加 公共默认构造函数 。例如。

public User() {
}

答案 5 :(得分:0)

我也有同样的错误:

***************************
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

我通过在主类中添加@EnableMongoRepositories注释来解决此问题:

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

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

答案 6 :(得分:0)

就我而言,问题完全不同。

@SpringBootApplication
@EnableNeo4jRepositories("com.digital.api.repositories") // <-- This was non-existent.
public class Application {

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

查看@ EnableNeo4jRepositories批注。定义的程序包不存在。 尝试定义该程序包,并注意Repository接口基于该程序包。 否则,Spring将找不到应该加载的存储库类!

答案 7 :(得分:0)

在我的情况下,问题是多余的@Autowired, 我最初使用@Autowired添加了一个依赖项,最终将其注释掉了,但是由于忘记了注释,因此@Autowired旁边的方法被认为是某种设置方法。

在删除多余注释时,它工作正常。

答案 8 :(得分:0)

我也遇到了同样的问题,对我来说,以下解决方案工作得很好:

我通过导入@AllArgsConstructor将我的班级注释为import lombok.AllArgsConstructor

我刚刚删除了此注释,代码开始工作。

希望这可能对某人有所帮助。

答案 9 :(得分:0)

我遇到了同样的问题,并且通过从Model类中删除了Constructor来解决了这个问题。在下面添加示例代码段:

Map<String, ServiceDefinition> serviceDefinitionMapper = new HashMap<>();
    A def;
    B serviceCharacter;

    @Autowired
    public Scan(Map<String, ServiceDefinition> serviceDefinitionMapper, A def,
            B serviceCharacter) {
        super();
        this.serviceDefinitionMapper = serviceDefinitionMapper;
        this.def = def;
        this.serviceCharacter = serviceCharacter;
    }

请注意:除非非常需要对它进行缩放,否则请不要在您的Model类中保留任何Constructor / @ AllArgsConstructor。

答案 10 :(得分:0)

即使按照上述解决方案,如果问题仍然存在,请检查您的导入语句。

就我而言,这是@service 注释的错误导入。

答案 11 :(得分:0)

就我而言,使用 lombok @NonNull 注释字段导致了问题。