'Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found

I am working on spring batch with spring boot 2.X application, actually its existing code i am checked out from git. While running the application it fails due to below error only for me and same code is working for others.

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.

I have checked below

  1. All Spring components are correctly annotated with @Component, @Service, @Controller,@Repository, etc...
  2. @ComponentScan & @EnableAutoCOnfiguration is also provided.
  3. Tried giving "java.lang.String" in declarations.

Code:

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


Solution 1:[1]

Since you do not provide the public default constructor and you added your own non-default constructor the instantiation will fail. I would suggest you to define the input file path as property like @Value("${inputFilePath}"). If you need further initialization in your bean define a void method and annotate it with @PostConstruct and do the initialization within.

Solution 2:[2]

Add a public default constructor in your class. For example.

public User() {
}

Solution 3:[3]

Make sure you are using spring-boot-starter-data-jpa

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

Solution 4:[4]

You defined something like this:

@Component
public class InputItemReader{

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

The name of your class suggest that your object is not a bean, just a simple object. You should try to use it in classic way:

new InputItemReader(myString);

or to have a static method to process the input String.

Explanation: Spring IoC container will try to instantiate a new InputItemReader object like this :

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

and will fail to call your constructor, because it will not know what you do actually expect and input string.

UPDATE: Your problem can be solved by removing @Component annotation and defining the bean in a configuration like this:

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

Solution 5:[5]

I had the same error but the error was generated by Feign Client. If you have this error using feign client you must add @EnableFeignClients on your main class:

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

Solution 6:[6]

For me, it was because of using @AllArgsConstructor annotation of the lombok. My code was like this:

@Service
@AllArgsConstructor
public class SampleService {

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

    private final SampleRepository sampleRepository;

And then, I removed @AllArgsConstructor and added @RequiredArgsConstructor annotation. The problem was solved.

@Service
@RequiredArgsConstructor
public class SampleService {

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

    private final BatchRepository batchRepository;

Solution 7:[7]

I also had the same 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

I solved this issue by adding @EnableMongoRepositories annotation in the main class:

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

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

Solution 8:[8]

I was also having the same problem, for me following solution worked perfectly fine:

I had annotated my class as @AllArgsConstructor by importing import lombok.AllArgsConstructor

I had just removed this annotation and the code starts working.

Hope this may help someone.

Solution 9:[9]

The issue in my case was a redundant @Autowired, I initially added a dependency using @Autowired, by eventually commented it out, however I forgot to comment the annotation, due to which the method next to @Autowired was considered as some sort of setter.

On removing the redundant annotation it is working fine.

Solution 10:[10]

Even after following the above solutions, if the problem still exists then please check your import statements.

In my case it was the wrong import of @service annotation.

Solution 11:[11]

in my case, the issue was way different.

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

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

Look at the @EnableNeo4jRepositories annotation. The package defined, was non-existent. Try defining that package, and be careful that the Repository interfaces are based there. Otherwise, Spring will not find the repositories classes that it should load up!

Solution 12:[12]

I was facing the same issue and it got fixed by removing Constructors from my Model class. Adding sample snippet below:

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

Please Note: Do not keep any Constructor/@AllArgsConstructor in your Model class unless it is very much needed to be decalred.

Solution 13:[13]

In my case annotating fields with lombok @NonNull was causing the trouble.

Solution 14:[14]

import lombok.RequiredArgsConstructor;

import lombok.extern.slf4j.Slf4j;

@Service
    @RequiredArgsConstructor
    @Transactional
    @Slf4j
    public class UserServiceImp implements UserService, UserDetailsService {
    ....
    }

Solution 15:[15]

I had this issue recently and it turned out I hadn't added a `@Component' annotation to the service file of my project. The effect was the class wasn't instantiated as a spring bean.

Solution 16:[16]

I faced same issue but with my own created interface repository that could not be found. The answer for me was that Spring 2.6.3 has bugs with Java 8. After i switched java to 11 version everything goes correct.

More info about this kind of problems i found here https://github.com/spring-projects/spring-boot/issues/6987

Solution 17:[17]

in my case I missed the @Service annotation so once I placed it works.

Solution 18:[18]

in my case i had this problem but it was because of i added an annotation of @Component in my Exception code which i shouldn't because we don't want it to be scanned really we're just using it to handle an exception in our service or i don't know try to delete the annotation in your built-in exception.

worked on my machine

Solution 19:[19]

I had this problem while testing with JUnit. It was that I forgot to create @MockBean annotation, that's why the bean was missing.