'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
- All Spring components are correctly annotated with @Component, @Service, @Controller,@Repository, etc...
- @ComponentScan & @EnableAutoCOnfiguration is also provided.
- 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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow