Spring MVC Test installation fails when loading ApplicationContext.xml

I am currently trying to configure Spring MVC Controller testing for a school project that I am working on next to my work. I usually program in php and frameworks like Laravel, so for me this is pretty new. The problem is that I cannot figure out how to solve the problem that appears when loading ApplicationContext. Any help is appreciated.

Update:

Now they tell me that test cases do not use jndi ref on my application server. Thus, this link will not work on a test example, it works fine when the application starts. Now I have made a second file called servlet-test.xml (listed below) , which uses the database link on port 3306. I use this file only in tests, and not when the application starts. But when I use this method, I get the Following error: Error creating bean with name 'productController': Injection of autowired dependencies failed . Any help is appreciated as I try to set up the MVC Controller tests for my school project. The other students I worked with were also stuck in the same problem, and I help them too.

I suspect the problem is as follows, but I'm not sure how to solve this.

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

Error stack trace

 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) 

The controller test I am trying to run is:

ProductController Test

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

file servlet.xml / applicationContext.xml

 <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"> <!-- module/package declarations --> <context:component-scan base-package="Application" /> <context:component-scan base-package="Authentication" /> <context:component-scan base-package="Photo" /> <context:component-scan base-package="Product" /> <context:component-scan base-package="Organisation" /> <context:component-scan base-package="Login" /> <context:component-scan base-package="UI" /> <context:component-scan base-package="I18n" /> <context:component-scan base-package="Internationalization" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton"> <property name="jndiName" value="java:app/fotoproducent" /> <property name="resourceRef" value="true" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> <property name="packagesToScan" value="*" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> </bean> </property> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> <mvc:resources mapping="/static/**" location="/static/"/> <mvc:resources mapping="/resources/**" location="/resources/" /> <mvc:default-servlet-handler/> <mvc:annotation-driven /> </beans> 

Dispatcher-servlet.xml

 <?xml version='1.0' encoding='UTF-8' ?> <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"> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMap ping"/> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="index.html">indexController</prop> <prop key="test.html">testController</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" /> <!-- The index controller. --> <bean name="indexController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" p:viewName="index" /> <!-- The test controller. --> <bean name="testController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" p:viewName="test" /> </beans> 

Update 1: "Data Source Configuration"

This shows how the data source is configured.

GlassFish-resources.xml

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"> <resources> <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"> <property name="serverName" value="localhost"/> <property name="portNumber" value="3306"/> <property name="databaseName" value="fotoproducent"/> <property name="User" value="root"/> <property name="Password" value="password"/> <property name="URL" value="jdbc:mysql://localhost:3306/fotoproducent?zeroDateTimeBehavior=convertToNull"/> <property name="driverClass" value="com.mysql.jdbc.Driver"/> </jdbc-connection-pool> <jdbc-resource enabled="true" jndi-name="app/fotoproducent" object-type="user" pool-name="mysql_fotoproducent_rootPool"/> </resources> 

Update 2: Optional Bean Configuration File (servlet-test.xml)

As a result, beans does not load. The following error: An error occurred while creating a Bean named "productController": it was not possible to deprive the autodetected dependencies

  <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"> <context:annotation-config/> <mvc:annotation-driven /> <!-- module/package declarations --> <context:component-scan base-package="Application" /> <context:component-scan base-package="Authentication" /> <context:component-scan base-package="Photo" /> <context:component-scan base-package="Product" /> <context:component-scan base-package="Organisation" /> <context:component-scan base-package="Login" /> <context:component-scan base-package="UI" /> <context:component-scan base-package="I18n" /> <context:component-scan base-package="Internationalization" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/fotoproducent?zeroDateTimeBehavior=convertToNull" /> <property name="username" value="root" /> <property name="password" value="password" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> <property name="packagesToScan" value="*" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> </bean> </property> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> <mvc:resources mapping="/static/**" location="/static/"/> <mvc:resources mapping="/resources/**" location="/resources/" /> </beans> 

Update 3: Additional troubleshooting code

Product controller

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

Product service

 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<Product> findAll() { Query q = this.em.createNamedQuery("product.namedquery", Product.class); return q.getResultList(); } } 
+6
source share
2 answers

According to your stack trace, when initializing the application context, they still try to load the wrong configuration files (servlet.xml), but they must load servlet-test.xml. Please try changing the location of your configurations using the path from the root folder (src), for example:

 @ContextConfiguration({"file:src/main/web/WEB-INF/servlet-test.xml", "file:src/main/web/WEB-INF/dispatcher-servlet.xml"}) 

PS You can also try to transfer your config for tests (servlet-test.xml) to src / test / resources and load it from the class path: "classpath: servlet-test.xml". You can also check this thread on stackoverflow: Spring @ContextConfiguration how to put the correct location for xml for an extended discussion of a similar problem.

+1
source

You will receive an error message stating that the Spring IOC container does not create or create an instance of the entityManagerFactory bean. What for?

This is another thing that your mistake mentions. He does not do this because he cannot create an instance of myDataSource bean. Why?

According to your error message:

  Lookup failed for 'java:app/fotoproducent' 

This means that when the IOC Spring container tried to create myDataSource bean, it could not do this because it was unable to set jndiName with the value java:app/fotoproducent

Instead of this:

 <bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton"> <property name="jndiName" value="java:app/fotoproducent" /> <property name="resourceRef" value="true" /> </bean> 

Replace it:

 <bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="your_driver_class_name" /> <property name="url" value="url_to_your_db" /> <property name="username" value="user_name_to_db" /> <property name="password" value="password_to_db" /> </bean> 

My suggestion is to create a standard data source, as mentioned above in the Spring docs.

Now remember to replace the values ​​for the driver class name, URL, username and password.

Here is an example from Spring docs how to determine the data source to use Hibernate ORM: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#orm-hibernate

0
source

All Articles