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

JavaSpring BootSpring BatchSpring Annotations

Java Problem Overview


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

Java Solutions


Solution 1 - Java

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

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

public User() {
}

Solution 3 - Java

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

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

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

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

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

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

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

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

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

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

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

Solution 14 - Java

> import lombok.RequiredArgsConstructor;

> import lombok.extern.slf4j.Slf4j;

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

Solution 15 - Java

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

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

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

Solution 18 - Java

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGaneshView Question on Stackoverflow
Solution 1 - JavaschoenerView Answer on Stackoverflow
Solution 2 - JavavkstreamView Answer on Stackoverflow
Solution 3 - JavaKailas010View Answer on Stackoverflow
Solution 4 - JavaAdina RoleaView Answer on Stackoverflow
Solution 5 - JavaJulien NowakView Answer on Stackoverflow
Solution 6 - JavaPayam SoudachiView Answer on Stackoverflow
Solution 7 - JavaRiccardoView Answer on Stackoverflow
Solution 8 - JavaVaibhav SharmaView Answer on Stackoverflow
Solution 9 - JavaKapil GuptaView Answer on Stackoverflow
Solution 10 - JavaDeeksha CherukuView Answer on Stackoverflow
Solution 11 - JavahernanemartinezView Answer on Stackoverflow
Solution 12 - Javaash dasView Answer on Stackoverflow
Solution 13 - JavabluelurkerView Answer on Stackoverflow
Solution 14 - JavaAadlani MohammedView Answer on Stackoverflow
Solution 15 - JavaMarcoMView Answer on Stackoverflow
Solution 16 - JavaonosjView Answer on Stackoverflow
Solution 17 - JavaUsama IqbalView Answer on Stackoverflow
Solution 18 - JavaKarim BaggariView Answer on Stackoverflow
Solution 19 - JavaLiubomyrView Answer on Stackoverflow