title: Spring MVC Test setup fails on loading ApplicationContext.xml
body: <p>Currently I'm trying to setup Spring MVC Controller testing for a school project I'm working on next to my job. Normally I program in php and frameworks like Laravel so this is pretty new for me. The problem is that I can't figure out how to solve the problem that keeps popping up on loading the ApplicationContext. Any help is appreciated.</p>
  
  <p><strong>Update:</strong></p>
  
  <p><em>I'm now told that test cases don't use a jndi ref in my app server. So this reference would fail on a test case, it runs fine on starting the application. Now I made a second file called <code>servlet-test.xml (listed below)</code> that uses a reference to the database on port 3306. I only use this file on tests not when starting up the application. But when I use this method I get   <code>Following error: Error creating bean with name 'productController': Injection of autowired dependencies failed</code>. Any help is welcome as I'm struggling to setup MVC Controller tests for my school project. Other students I've been working with also are stuck with the same problem I am so I could help them out too.</em> </p>
  
  <p><strong>I suspect the problem is the following, but I'm not sure how to solve this.</strong></p>
  
  <pre><code>Error creating bean with name 'myDataSource' defined in URL 
  [file:web/WEB-INF/servlet.xml]: Invocation of init method failed; 
  nested exception is javax.naming.NamingException: Lookup failed for
  'java:app/fotoproducent' ...
  </code></pre>
  
  <p><strong>The Error Stack Trace</strong></p>
  
  <pre><code>java.lang.IllegalStateException: Failed to load ApplicationContext
  
  Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [file:web/WEB-INF/servlet.xml]: Cannot resolve reference to bean 'myDataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myDataSource' defined in URL [file:web/WEB-INF/servlet.xml]: Invocation of init method failed; nested exception is javax.naming.NamingException: Lookup failed for 'java:app/fotoproducent' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ]
  at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
  at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1456)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1197)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
  at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973)
  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750)
  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
  at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:121)
  at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
  at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
  at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:250)
  at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
  at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
  </code></pre>
  
  <p>The Controller test i'm trying to run:</p>
  
  <p><strong>ProductController Test</strong></p>
  
  <pre><code>package controller.tests.config;
  import org.junit.Before;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  import org.springframework.test.web.servlet.MockMvc;
  import org.springframework.web.context.WebApplicationContext;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.test.web.servlet.ResultMatcher;
  import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
  import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  import org.springframework.test.web.servlet.setup.MockMvcBuilders;
  import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
  import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder;
  
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration({"file:web/WEB-INF/servlet-test.xml", "file:web/WEB-INF/dispatcher-servlet.xml"})
  
  public class ProductControllerTest {
  
      @Autowired
      private WebApplicationContext wac;
      private MockMvc mockMvc;
  
      @Before
      public void setup() {
          DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac);
          this.mockMvc = builder.build();
      }
  
      @Test
      public void testProductAction() throws Exception {
         ResultMatcher ok = MockMvcResultMatchers.status().isOk();
         ResultMatcher msg = MockMvcResultMatchers.model()
                         .attribute("msg", "Spring quick start!!");
  
         MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/product");
         this.mockMvc.perform(builder)
                 .andExpect(ok)
                 .andExpect(msg);
      }
  
  }
  </code></pre>
  
  <p><strong>servlet.xml / applicationContext.xml file</strong></p>
  
  <pre><code>&lt;beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:mvc="http://www.springframework.org/schema/mvc"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&gt;
  
  &lt;!-- module/package declarations --&gt;
  &lt;context:component-scan base-package="Application" /&gt;
  &lt;context:component-scan base-package="Authentication" /&gt;
  &lt;context:component-scan base-package="Photo" /&gt; 
  &lt;context:component-scan base-package="Product" /&gt;
  &lt;context:component-scan base-package="Organisation" /&gt;
  &lt;context:component-scan base-package="Login" /&gt;
  &lt;context:component-scan base-package="UI" /&gt;
  &lt;context:component-scan base-package="I18n" /&gt;
  &lt;context:component-scan base-package="Internationalization" /&gt;
  
  &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;
      &lt;property name="prefix"&gt;
          &lt;value&gt;/WEB-INF/views/&lt;/value&gt;
      &lt;/property&gt;
      &lt;property name="suffix"&gt;
          &lt;value&gt;.jsp&lt;/value&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  
  &lt;bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton"&gt; 
      &lt;property name="jndiName" value="java:app/fotoproducent" /&gt; 
      &lt;property name="resourceRef" value="true" /&gt; 
  &lt;/bean&gt;
  
  &lt;tx:annotation-driven transaction-manager="transactionManager" /&gt;
  &lt;bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
      &lt;property name="entityManagerFactory" ref="entityManagerFactory" /&gt;
  &lt;/bean&gt;
  
  &lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
      &lt;property name="dataSource" ref="myDataSource" /&gt;
      &lt;property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /&gt;        
      &lt;property name="packagesToScan" value="*" /&gt;
      &lt;property name="jpaVendorAdapter"&gt;
          &lt;bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&gt;
              &lt;property name="showSql" value="true" /&gt;
              &lt;property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /&gt;
          &lt;/bean&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  
  &lt;bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/&gt;
  
  &lt;mvc:resources mapping="/static/**" location="/static/"/&gt;
  &lt;mvc:resources mapping="/resources/**" location="/resources/" /&gt;
  &lt;mvc:default-servlet-handler/&gt;
  &lt;mvc:annotation-driven /&gt;
  
  &lt;/beans&gt;
  </code></pre>
  
  <p><strong>Dispatcher-servlet.xml</strong></p>
  
  <pre><code>&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
  &lt;beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"&gt;
  
  &lt;bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMap ping"/&gt;
  
  &lt;bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt;
      &lt;property name="mappings"&gt;
          &lt;props&gt;
              &lt;prop key="index.html"&gt;indexController&lt;/prop&gt;
              &lt;prop key="test.html"&gt;testController&lt;/prop&gt;
          &lt;/props&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  
  &lt;bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/views/"
        p:suffix=".jsp" /&gt;
  
  &lt;!--
  The index controller.
  --&gt;
  &lt;bean name="indexController"
        class="org.springframework.web.servlet.mvc.ParameterizableViewController"
        p:viewName="index" /&gt;
  
  &lt;!--
  The test controller.
  --&gt;
  &lt;bean name="testController"
        class="org.springframework.web.servlet.mvc.ParameterizableViewController"
        p:viewName="test" /&gt;
  
  
  &lt;/beans&gt;
  </code></pre>
  
  <p><strong>Update 1: "DataSource Configuration"</strong></p>
  
  <p>This shows how the datasource is configured.</p>
  
  <p><strong>glassfish-resources.xml</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"&gt;
  &lt;resources&gt;
  &lt;jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_fotoproducent_rootPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"&gt;
      &lt;property name="serverName" value="localhost"/&gt;
      &lt;property name="portNumber" value="3306"/&gt;
      &lt;property name="databaseName" value="fotoproducent"/&gt;
      &lt;property name="User" value="root"/&gt;
      &lt;property name="Password" value="password"/&gt;
      &lt;property name="URL" value="jdbc:mysql://localhost:3306/fotoproducent?zeroDateTimeBehavior=convertToNull"/&gt;
      &lt;property name="driverClass" value="com.mysql.jdbc.Driver"/&gt;
  &lt;/jdbc-connection-pool&gt;
  &lt;jdbc-resource enabled="true" jndi-name="app/fotoproducent" object-type="user" pool-name="mysql_fotoproducent_rootPool"/&gt;
  &lt;/resources&gt;
  </code></pre>
  
  <p><strong>Update 2: Additional Bean Config file (servlet-test.xml)</strong></p>
  
  <p>This results in beans not being loaded. Following error: Error creating bean with name 'productController': Injection of autowired dependencies failed</p>
  
  <pre><code> &lt;beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:mvc="http://www.springframework.org/schema/mvc"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&gt;
  
  &lt;context:annotation-config/&gt;
  &lt;mvc:annotation-driven /&gt;
  
  &lt;!-- module/package declarations --&gt;
  &lt;context:component-scan base-package="Application" /&gt;
  &lt;context:component-scan base-package="Authentication" /&gt;
  &lt;context:component-scan base-package="Photo" /&gt; 
  &lt;context:component-scan base-package="Product" /&gt;
  &lt;context:component-scan base-package="Organisation" /&gt;
  &lt;context:component-scan base-package="Login" /&gt;
  &lt;context:component-scan base-package="UI" /&gt;
  &lt;context:component-scan base-package="I18n" /&gt;
  &lt;context:component-scan base-package="Internationalization" /&gt;
  
  
   &lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;
      &lt;property name="prefix"&gt;
          &lt;value&gt;/WEB-INF/views/&lt;/value&gt;
      &lt;/property&gt;
      &lt;property name="suffix"&gt;
          &lt;value&gt;.jsp&lt;/value&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  
  &lt;bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;
      &lt;property name="driverClassName" value="com.mysql.jdbc.Driver" /&gt;
      &lt;property name="url" value="jdbc:mysql://localhost:3306/fotoproducent?zeroDateTimeBehavior=convertToNull" /&gt;
      &lt;property name="username" value="root" /&gt;
      &lt;property name="password" value="password" /&gt;
  &lt;/bean&gt;
  
  &lt;tx:annotation-driven transaction-manager="transactionManager" /&gt;
  &lt;bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
      &lt;property name="entityManagerFactory" ref="entityManagerFactory" /&gt;
  &lt;/bean&gt;
  
  &lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
      &lt;property name="dataSource" ref="myDataSource" /&gt;
      &lt;property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /&gt;        
      &lt;property name="packagesToScan" value="*" /&gt;
      &lt;property name="jpaVendorAdapter"&gt;
          &lt;bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&gt;
              &lt;property name="showSql" value="true" /&gt;
              &lt;property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /&gt;
          &lt;/bean&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  
  &lt;bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/&gt;
  
  &lt;mvc:resources mapping="/static/**" location="/static/"/&gt;
  &lt;mvc:resources mapping="/resources/**" location="/resources/" /&gt;
  
  
  &lt;/beans&gt;
  </code></pre>
  
  <p><strong>Update 3: Additional Code for problem resolving</strong></p>
  
  <p><strong>Product Controller</strong></p>
  
  <pre><code>package Product.Controller;
  
  import Product.Sevice.ProductService;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Controller;
  import org.springframework.ui.ModelMap;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestMethod;
  
  @Controller
  @RequestMapping("/product")
  public class ProductController {
  
      @Autowired
      protected ProductService service;
  
      @RequestMapping(value = "", method = RequestMethod.GET)
      public String productAction(ModelMap model)
      {
          model.put("productList", this.service.findAll());
  
          return "product/overview";
      }
  }
  </code></pre>
  
  <p><strong>Product Service</strong></p>
  
  <pre><code>package Product.Sevice;
  
  import Product.Entity.Product;
  import java.util.List;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import javax.persistence.Query;
  import javax.transaction.Transactional;
  import org.springframework.stereotype.Service;
  
  @Service
  public class ProductService {
  
      @PersistenceContext
      private EntityManager em;
  
      @Transactional
      public void insert(Product product)
      {
          // insert into database
          // persist function is for NEW entities in database
          this.em.persist(product);
      }
  
      @Transactional
      public Product get(Integer id)
      {
          // this gets the entity from the database and returns it
          return this.em.find(Product.class, (long) id);
      }
  
  
      @Transactional
      public Product update(Product product)
      {
          // this updates the ExampleEntity in within the database
          return this.em.merge(product);
      }
  
      @Transactional
      public void remove(Integer id)
      {
          Product product = this.em.find(Product.class, (long) id);
          product.delete();
  
          // this updates the product in within the database
          this.update(product);
      }
  
      @Transactional
      public List&lt;Product&gt; findAll()
      {
          Query q = this.em.createNamedQuery("product.namedquery", Product.class);
          return q.getResultList();
      }
  }
  </code></pre>