Ganesh
Ganesh

Reputation: 1113

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

Upvotes: 94

Views: 436399

Answers (30)

ReemRashwan
ReemRashwan

Reputation: 371

For me: force updating Maven dependencies solved the problem. Maven was just installed, and the error didn't indicate anything related to dependencies. Steps to solve the problem on IntelliJ:

  1. Open pom.xml
  2. Click maven refresh button
  3. A message will appear that there is a problem with dependencies, do you want to force update them? click yes or similar button.

Upvotes: 0

Dev Krishna Sadana
Dev Krishna Sadana

Reputation: 77

For me, I had made a mistake by writing wrong annotation in application file as -@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}).

I removed the excluded path and it worked post that.

Upvotes: 3

Eduardo Briguenti Vieira
Eduardo Briguenti Vieira

Reputation: 4579

In my case, I just needed to add lombok.config file in the root of my project with the following info:

config.stopBubbling=true
lombok.addLombokGeneratedAnnotation=true
lombok.copyableAnnotations+=org.springframework.beans.factory.annotation.Value

Upvotes: 0

Alok Agase
Alok Agase

Reputation: 63

Using @Component worked for me

Upvotes: 2

Abhijith Mengaram
Abhijith Mengaram

Reputation: 39

I had a similar issue in a different scenario. I had everything perfectly working until I found that the main Application method has several annotations along with @EnableAutoConfiguration.

Also, make sure the services and their classes are @Overriding and @Autowired as needed.

I removed all the unwanted annotations, and it worked like a charm!!

From:

@EntityScan(basePackages = {"com.some.*"})  //removed
@EnableJpaRepositories(basePackages = {"com.some.*"}) //removed
@EnableAutoConfiguration
@EnableAsync
@ComponentScan(basePackages = {"com.some.*"}) //removed

to:

@SpringBootApplication //this will ask Spring to do scanning, if your package structure is good, you can just use this

@Controller
MyController {

//has Autowired dependency
@Autowired
private MyService myservice;

//using myService.someMethod(String parameter);

}

Removed the

[12Dec2023 14:40:32.65]WARN

o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - 
Exception encountered during context initialization - cancelling refresh attempt: 
org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'myController': Unsatisfied dependency expressed through field 'myService': 
Error creating bean with name 'myServiceImpl': 
Unsatisfied dependency expressed through method 'someMethod' parameter 0: 
No qualifying bean of type 'java.lang.String' available: 
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Description:

Parameter 0 of method someMethod in com.service.MyServiceImpl required a bean of type 'java.lang.String' that could not be found.

The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true)

Upvotes: 0

onosj
onosj

Reputation: 1

I faced the 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 to the Java 11 version everything goes correctly.

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

Upvotes: 0

Kapil Gupta
Kapil Gupta

Reputation: 332

The issue in my case was a redundant @Autowired, I initially added a dependency using @Autowired, by eventually commenting it out, however, I forgot to comment on 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.

Upvotes: 2

Karim Baggari
Karim Baggari

Reputation: 9

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.

Upvotes: 0

hernanemartinez
hernanemartinez

Reputation: 717

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!

Upvotes: 0

ash das
ash das

Reputation: 967

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 declared.

Upvotes: 0

Grant Dennany
Grant Dennany

Reputation: 1

Adding to the "services" block of my application-default.yml & application-kubernetes.yml fixed the issue for me.

Upvotes: 0

Usama Iqbal
Usama Iqbal

Reputation: 51

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

Upvotes: 4

Kailas010
Kailas010

Reputation: 435

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

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

Upvotes: 22

Enis Arik
Enis Arik

Reputation: 677

In my case, I had to use RequiredArgsContructor annotation and removed final keyword for the variable blobContainerName. In the end, it looks like this.

@Service
@RequiredArgsConstructor
public class AzureStorageServiceImpl implements StorageService {

    @Value("${spring.cloud.azure.storage.blob.container-name}")
    private String blobContainerName;

Upvotes: 0

Tarun tej Daroori
Tarun tej Daroori

Reputation: 1

This issue occurred when using spring boot 3.

I used below dependency for sql connecto. Replaced javax with Jakarta for @Table and @Entity. This resolved my issue.

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.1.0</version>
</dependency>

Upvotes: 0

Premchandra
Premchandra

Reputation: 31

This issue will also occurs when by mistake method is @Autowired in place of @Override but this is a rare case.

General Case:

  1. Missing Bean Definition (Service or any component should be anotated properly)
  2. Component Scan Make sure that the package containing your class is included in Spring's component scan.
  3. Bean Configuration: Verify that you have a bean definition (for Instance you are trying to autowire) in your Spring configuration.
  4. @Autowired Annotation: Ensure that the @Autowired annotation is correctly used.

Upvotes: 0

Vaibhav Sharma
Vaibhav Sharma

Reputation: 1742

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.

Upvotes: 5

Use:

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

instead of:

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

Upvotes: 0

PatientlyExpert
PatientlyExpert

Reputation: 1

If you want to add beans to your context that are defined in some external library then use @Import annotation and pass the class file name/bean name. Add @Import to your main configuration file having @SpringBootApplication annotation

Ref : https://www.baeldung.com/spring-import-annotation

Upvotes: 0

Sagar Nimbalkar
Sagar Nimbalkar

Reputation: 1

Generate Constructor from Superclass. It worked for me.

e.g.

public UserModel() {
        super();
        // TODO Auto-generated constructor stub
    }

Upvotes: 0

Natnael Kagnaw
Natnael Kagnaw

Reputation: 75

Check if the application.properties file is written correctly.

For some reason my application was spring.profiles.on=test in the application.properties file.

When i change it to the proper value of spring.profiles.active=test it worked.

Upvotes: 0

user2722345
user2722345

Reputation: 11

In my case, removing the @EnableJpaRepositories annotation from my config fixed the issue. The repositories are still wired correctly.

Before:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@EnableJpaAuditing
public class PersistenceConfig {

After:

@Configuration
@EnableTransactionManagement
@EnableJpaAuditing
public class PersistenceConfig {

Upvotes: 0

Jdslk
Jdslk

Reputation: 97

For it to work I had to add this @RequiredArgsConstructor annotation to my class, and then added this @Value("${inputFilePath}") annotation to access the variable. See below:

    @Component
    @RequiredArgsConstructor
    public class InputItemReader extends  FlatFileItemReader<Map<String, 
     Object>> implements StepExecutionListener {

        @Value("${inputFilePath}")
        private inputFilePath;


        //...

    }

Upvotes: 0

Abhijit Pritam Dutta
Abhijit Pritam Dutta

Reputation: 5591

Not related to the above issue but if you have the same error of bean creation in a spring boot application and you are getting the same above error please check whether you have added the class path in @ComponentScan( of the main spring booth application launching class.

Upvotes: 0

Liubomyr
Liubomyr

Reputation: 1

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

Upvotes: 0

Payam Soudachi
Payam Soudachi

Reputation: 489

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;

Upvotes: 19

Aadlani Mohammed
Aadlani Mohammed

Reputation: 21

import lombok.RequiredArgsConstructor;

import lombok.extern.slf4j.Slf4j;

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

Upvotes: 0

bluelurker
bluelurker

Reputation: 1444

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

Upvotes: 0

Deeksha Cheruku
Deeksha Cheruku

Reputation: 41

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.

Upvotes: 4

Julien Nowak
Julien Nowak

Reputation: 61

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 {
...
}

Upvotes: 5

Related Questions