title: Unsatisfied dependency expressed through field (Spring Boot v 1.5.1)
body: <p>I am newbie in spring boot and mongoDB please help.</p>
  
  <p>I am getting unsatified dependcy expressed through mongoTemplate, I am unable to find the root cause of it. Below is the stack trace of it.</p>
  
  <pre><code>"org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'gmailPullHandler': Unsatisfied dependency expressed through field 'gmailPullService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'gmailPullService': Unsatisfied dependency expressed through field 'gmailMailDataRepository'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'gmailMailDataRepositoryImpl': Unsatisfied dependency expressed through field 'mongoTemplate'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mongoTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Unsatisfied dependency expressed through method 'mongoTemplate' parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mappingMongoConverter' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Unsatisfied dependency expressed through method 'mappingMongoConverter' parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoMappingContext' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.StackOverflowError
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
      at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
      at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
      at com.plash.configurator.Application.main(Application.java:38)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:498)
      at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
      at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
      at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
      at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
  </code></pre>
  
  <p>Since there are three unsatisfied dependency which one is causing error, i am unable to find it.</p>
  
  <p><strong>NOTE:</strong>  gmailMailDataRepository class is extended by MongoRepository, GmailMailDataRepositoryCustom</p>
  
  <p>gmailMailDataRepository :</p>
  
  <pre><code>@Repository
  public interface GmailMailDataRepository extends MongoRepository&lt;GmailMailData, String&gt;, GmailMailDataRepositoryCustom {
  
  
     {'threadidslist.threadid':?1}{'useremail':?2}")
      List&lt;GmailMailData&gt; getListByThreadidmMsgidEmailid(String messagid, String threadid, String useremail);
  
  
      void saveObjectToMsgList(GmailMessages gm, String useremailid, String threadid, String prospectemailid);
  
  
  }
  </code></pre>
  
  <p>Below is GmailMailDataRepositoryCustom and GmailMailDataRepositoryImpl:</p>
  
  <p>GmailMailDataRepositoryCustom:</p>
  
  <pre><code>    public interface GmailMailDataRepositoryCustom {
  
      void saveObjectToMsgList(GmailMessages g, String useremailid, String threadid, String prospectemailid);
  }
  </code></pre>
  
  <p>GmailMailDataRepositoryImpl:</p>
  
  <pre><code>public class GmailMailDataRepositoryImpl implements GmailMailDataRepositoryCustom {
  // private final MongoOperations operations;
  
  
  @Autowired
  private MongoTemplate mongoTemplate;
  
  
  Update update = new Update();
  
  @Override
  public void saveObjectToMsgList(GmailMessages gm, String useremailid, String threadid, String prospectemailid) {
  
      Query query = new Query(Criteria.where("useremail").is(useremailid).and("prospectemailid").is(prospectemailid).and("threadidslist.threadid").is(threadid));
      update.push("threadidslist.$.messagelist", gm);
      mongoTemplate.updateFirst(query, update, GmailMailData.class);
  
  }
  </code></pre>
  
  <p>Application.properities configuration for mongo is as following:</p>
  
  <pre><code>spring.data.mongodb.host=localhost
  spring.data.mongodb.password=#########
  spring.data.mongodb.port=27017
  spring.data.mongodb.repositories.enabled=true
  </code></pre>
  
  <p>build.gradle:</p>
  
  <pre><code>compile("org.springframework.boot:spring-boot-starter-data-mongodb")
  </code></pre>