Protagonist
Protagonist

Reputation: 1669

What is config.properties in Spring and what is the use of it

I'm trying to build a simple CRUD operation on task management.

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>SampleApplication</display-name>

      <welcome-file-list>
        <welcome-file>html/homepage.html</welcome-file>

    </welcome-file-list>

    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/spring-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>

</web-app>

Spring-servlet.xml

<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:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:property-placeholder location="classpath:/config.properties"/>

    <!-- Spring will search in the bellow paths controller an services annotations-->   
    <context:component-scan base-package="org.itc" /> 
    <mvc:resources mapping="/html/**" location="/html/" />
    <mvc:resources mapping="/js/**" location="/js/" />
    <mvc:annotation-driven />


    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/task" />
        <property name="username" value="root" />
        <property name="password" value="root" />
    </bean>
</beans>

Im getting the below error.

org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [config.properties] cannot be opened because it does not exist
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:151)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:265)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:162)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:609)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4842)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: class path resource [config.properties] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
    at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:143)
    at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:98)
    at org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:175)
    at org.springframework.core.io.support.PropertiesLoaderSupport.mergeProperties(PropertiesLoaderSupport.java:156)
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:142)
    ... 16 more

What does config.properties file missing mean? Im new to spring and trying to configure Spring MVC.

Upvotes: 0

Views: 1224

Answers (5)

OrangeDog
OrangeDog

Reputation: 38836

You have defined

<context:property-placeholder location="classpath:/config.properties"/>

That is, you want the application to load properties from the file config.properties found in the application's classpath.

The error means that it cannot find this file.

Without knowing your exact layout, build-chain or how you start the application I can't say exactly where you should put this file in order to have it available to the application. Somewhere like /src/main/resources/ perhaps.

If instead you don't need this file or externalised properties in general, you can stop telling the application that you do: Remove its definition from spring-servlet.xml.

Upvotes: 1

Manzar
Manzar

Reputation: 11

If you are going to use properties file you will have to declare bean org.springframework.beans.factory.config.PropertyPlaceholderConfigurer in your Spring-servlet.xml file.

Your Spring-servlet.xml:

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="location">
        <value>classpath:config.properties</value>
    </property>
</bean>

your datasource bean will look like the following.

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="db.url.property" />
    <property name="username" value="db.user" />
    <property name="password" value="db.password" />
</bean>

You should have config.properties in your class path containing following properties.

Your config.properties

 db.url.property=jdbc:mysql://localhost:3306/task
 db.user=root
 db.password=root

Upvotes: 0

P_M
P_M

Reputation: 2952

config.properties used to save application variables (properties). I find it very useful because:

  • This file as mentioned can store some initial application cofig data, like db connection.
  • You can create your own properties and inject their values within Spring application. Also this properties can be preset with application run command (command line arguments)
  • You can compile your application with config.properties inside, but on deployment create config.properties outside of compiled app and Spring will use properties from it instead of compiled file.
  • You can preset profiles, and they will help on development, test, and deployment stage, because each bean can be marked with profile and will be injected depending on your application run mode.

These are features I use, and could be much more. Actually I not find any description how-to about config.properties. All this stuff mentioned in different places in Spring manual.

Update

Try Spring Boot - it contains Spring MVC, Hibernate and I found many good examples for starters. It was build to reduce initial config efforts.

Upvotes: 1

amicoderozer
amicoderozer

Reputation: 2154

If you don't have properties file in your application, remove this line from the Spring-servlet.xml file:

<context:property-placeholder location="classpath:/config.properties"/>

You are telling spring to search for a properties file named config.properties which does not exists.

If you need a properties file, then create the config.properties and put it in your classpath.

Upvotes: 1

Praveen Kumar Mekala
Praveen Kumar Mekala

Reputation: 638

ensure that you have config.properties and the file is placed in the /WEB-INF/classes folder and use classpath:/config.properties.

Upvotes: 0

Related Questions