Som
Som

Reputation: 1610

Spring Boot @Autowire not working. Error creating bean

Hi I have a spring boot project. The main class package is like this :

com.som.demo

I have used an external jar as a maven dependency in my project. In that jar there is a service class annotated with @Service as below :

@Service
public class SomeServiceImpl implements SomeService {
      @Autowired
      private TreeCacheWrapper ffCoreCache;

      @Autowired(required = false)
      private ZookeeperProperties zookeeperProperties;

      public SomeServiceImpl(TreeCacheWrapper ffCoreCache, ZookeeperProperties zookeeperProperties) {
         this.ffCoreCache = ffCoreCache;
         this.zookeeperProperties = zookeeperProperties;
      }
}

And the main package where this SomeServiceImpl class is as below :

com.som.test

Now in my project when I am autowiring the class I get the bean creation error while running the spring boot app. This is how I am doing :

@Autowired
private SomeService someService;

Error :

 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'someServiceImpl'
Unsatisfied dependency expressed through field 'ffCoreCache'; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'ffCoreCache' defined in class path resource [com/som/test/config/ZooKeeperConfig.class]: 
Bean instantiation via factory method failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [com.som.test.cache.TreeCacheWrapper]: 
Factory method 'ffCoreCache' threw exception; 
nested exception is java.lang.NoClassDefFoundError: org/apache/curator/retry/ExponentialBackoffRetry


Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'ffCoreCache' defined in class path resource [com/som/test/config/ZooKeeperConfig.class]: 
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [com.som.test.cache.TreeCacheWrapper]: 
Factory method 'ffCoreCache' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/curator/retry/ExponentialBackoffRetry



Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.som.test.cache.TreeCacheWrapper]: 
Factory method 'ffCoreCache' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/curator/retry/ExponentialBackoffRetry

Caused by: java.lang.NoClassDefFoundError: org/apache/curator/retry/ExponentialBackoffRetry

Caused by: java.lang.ClassNotFoundException: org.apache.curator.retry.ExponentialBackoffRetry

Upvotes: 1

Views: 2761

Answers (3)

Mhamad El Itawi
Mhamad El Itawi

Reputation: 254

Spring boot by default scan to beans in your main package. you can configure it using

@SpringBootApplication(scanBasePackages={"com.som.demo" , "com.som.test"})

Upvotes: 0

Arivazhagan
Arivazhagan

Reputation: 53

Annotate Service interface with @Service, not the Implementation class and try to annotate ServiceImplementation class with @Component.

Upvotes: 0

Mark Bramnik
Mark Bramnik

Reputation: 42541

When spring boot application starts, it scans for beans in the same package as your main class, and all packages beneath it.

Since your main class resides in the package com.som.demo spring boot will find any beans in this package, or in packages like com.som.demo.sample1, com.som.demo.a.b.c etc However it won't scan com.som.test package because its a "peer" to the main package.

In general you can configure spring boot to scan the packages of your choice with the help of @ComponentScan annotation that accepts a list of base packages to scan. You can put this annotation right on your main class (next to @SpringBootApplication).

However this is kind of against the conventions of spring boot.

Read this tutorial for more technical details and examples.

Upvotes: 1

Related Questions