(Spring) class path resource exception java.io.FileNotFoundException - spring

I have aded following code to my web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:com/neelamhotel/mavenwebproject5/configs/dao-context.xml
</param-value>
But I am getting error for the same as
IOException parsing XML document from class path resource [com/neelamhotel/mavenwebproject5/configs/dao-context.xml]; nested exception is java.io.FileNotFoundException: class path resource [com/neelamhotel/mavenwebproject5/configs/dao-context.xml] cannot be opened because it does not exist
Project Structure
Explorer View
I know dao-context.xml file is there. But then why it is giving an error ?
Updated Explorer view
Created WAR file view

In a Maven project, src/main/java is for Java source files. The other files are ignored by Maven.
Resources (i.e. non-Java files) that must be copied and be available in the classpath must go in src/main/resources.
Gradle uses the same conventions.

Related

Spring container is looking at wrong path while loading multiple spring configuration files

We are using Spring framework in the project. I am loading applicationContext file from web.xml in the following way:
<servlet>
<servlet-name>SpringDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/CustomerService/applicationContext.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringDispatcherServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
I am trying to load one configuration file JobDesigner-springintegration.xml inside the applicationContext file in the following way:
<import resource="JobDesigner-springintegration.xml"/>
Now, I am trying to load few more configuration files inside the
`JobDesigner-springintegration.xml` file in the following manner:
<import resource="*.xml"/>
But weirdly the spring container is looking in a wrong path something like below:
jndi:/localhost/cciupg/WEB-INF/CustomerService/
The log excerpts is shown below:
12:52:15,202 INFO [STDOUT] 12:52:15,202 INFO [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/CustomerService/JobDesigner-springintegration.xml]
12:52:15,453 INFO [STDOUT] 12:52:15,448 WARN [PathMatchingResourcePatternResolver] Cannot search for matching files underneath URL [jndi:/localhost/cciupg/WEB-INF/CustomerService/] because it does not correspond to a directory in the file system
java.io.FileNotFoundException: URL [jndi:/localhost/cciupg/WEB-INF/CustomerService/] cannot be resolved to absolute file path because it does not reside in the file system: jndi:/localhost/cciupg/WEB-INF/CustomerService/
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
at org.springframework.core.io.UrlResource.getFile(UrlResource.java:169)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.doFindPathMatchingFileResources(PathMatchingResourcePatternResolver.java:526)
at org.springframework.web.context.support.ServletContextResourcePatternResolver.doFindPathMatchingFileResources(ServletContextResourcePatternResolver.java:92)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:347)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:279)
at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1269)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:208)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:261)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:197)
at org.springframework.beans.factory.xml.DefaultBeanDe
The question here is why the spring container is looking at wrong path jndi:/localhost/cciupg/WEB-INF/CustomerService/ instead of /WEB-INF/CustomerService/?
And the weird part is why it is appending jndi:/localhost/cciupg to the path?
WEB-INF is not part of the classpath I believe. Therefore it cannot find the your *.xml files. I believe jndi is likely the last location spring has checked when throwing the error after looking down the classpath.
In other words, try putting your files in the classpath. In java projects I usually see resources in the main -> resources path.

java.io.FileNotFoundException: class path resource [conf/admin/applicationContext.xml] cannot be opened because it does not exist

I'm using Spring Security, but for some reason my web.xml isn't finding my applicationContext.xml
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:conf/admin/applicationContext.xml
classpath:conf/admin/applicationContext-security.xml
</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
My applicationContext.xml is in myProject/conf/admin/applicationContext.xml, in the same place as my web.xml but it always throws the exception:
14:18:07,793 ERROR [ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [conf/admin/applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [conf/admin/applicationContext.xml] cannot be opened because it does not exist
I've tried putting inside the WEB-INF folder ( like every Spring Security tutorial does ) which is in myProject/dist/web/WEB-INF, but when I clean my project to refresh and rebuild it gets deleted.
So what am I doing wrong? Putting the wrong path in contextConfigLocation or applicationContext.xml in the wrong place?
Assuming that you are following the Standard Maven Directory Structure i.e. your XML config files are under src/main/webapp/WEB-INF/conf/admin then try this:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/conf/admin/applicationContext.xml
/WEB-INF/conf/admin/applicationContext-security.xml
</param-value>
</context-param>
Another approach is to go with the defaults:
Just place you applicationContext.xml file under src/main/webapp/WEB-INF and it will be picked up by spring by default.
You can then add this <import resource="applicationContext-security.xml" /> line in your applicationContext.xml to import Security config.
Check this Repository using default config approach.

importing XML config into java config based (annotation) project

I'm working on Spring MVC annotation based application. I have web.xml file entry as follows (using WebConfig.java for configuration):
<servlet>
<servlet-name>sdsdispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.conf.WebConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Now when I try to integrate security related XML file I'm facing following error
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:638)
I tried to import xml file as follows:
#Configuration
#EnableWebMvc
#ComponentScan("com.stk.controller")
#ImportResource({"securityContext.xml"})
public class WebConfig extends WebMvcConfigurerAdapter {
Screenshot
http://i.stack.imgur.com/BosWG.jpg
Add classpath as shown below, provided its in classpath
#ImportResource("classpath:securityContext.xml")
If you have multiple configuration files then
#ImportResource(locations={"classpath:securityContext.xml","file://c:/test-config.xml"})
You can access the file from WEB-INF directory using
#ImportResource("file:**/WEB-INF/securityContext.xml")
However I would recommend you to move configuration file to src/main/resource directory and use the file line that is loading file using classpath. These files will be copied to WEB-INF/classes directory during packing of war by maven which is classpath

Custom log4j.properties location for Spring web application

Is it possible to provide custom location for the log4j.properties file for the log4j 1.x?
I don't want to include the file in the project's resources folder.
configure the org.springframework.web.util.Log4jConfigListener in your web.xml with context-parameter log4jConfigLocation.
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>file:C:/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
Log4jConfigListener JavaDoc:
Bootstrap listener for custom log4j initialization in a web environment. Delegates to Log4jWebConfigurer...
Log4jWebConfigurer JavaDoc:
Location of the log4j config file; either a "classpath:" location
(e.g. "classpath:myLog4j.properties"), an absolute file URL (e.g.
"file:C:/log4j.properties), or a plain path relative to the web
application root directory (e.g. "/WEB-INF/log4j.properties"). If not
specified, default log4j initialization will apply ("log4j.properties"
or "log4j.xml" in the class path; see the log4j documentation for
details). "log4jRefreshInterval":

how to change application context path for ContextLoaderListener

In my application by default org.springframework.web.context.ContextLoaderListener looks for Applicationcontext.xml in WEB-INF folder. Now i want to move Applicationcontext.xml file to src/main/resources folder. But if i do this i get error java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml].
How do i specify ContextLoaderListener to look for file in resources folder? please help
If you added it to Mavens resources folder simply add:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
to your web.xml.

Resources