Read properties values in Java Spring Controller

To configure the environmental parameters, we read the values from property files. I have a controller which upload the files. The uploaded files will be saved in a location, which is defined in a property file. In this example I shall show you how to read the location name from the property file.


@Controller
@PropertySource("classpath:app.properties")
public class FileUploadController {
  @Value("${upload.Folder}")
  String uploadFolder;
}

I have defined the property in app.properties file which is saved in src folder (or any other path defined in classpath.


upload.Folder=C:\\vss\\upload

Thats it! The variable uploadFolder will be assigned using the values given by app.properties.

No Spring WebApplicationInitializer types detected on classpath

Wah, what a stupid error it was!

My Spring web app, which was running smoothly, refused to start. I don’t find any logs in log4j or tomcat log. Only clue I had was –

No Spring WebApplicationInitializer types detected on classpath

Here is how I solved it –

  1. Stop the tomcat
  2. Clean and build all eclipse projects
  3. Goto server tab and select the tomcat server. Press clean. Press clean work directory.
  4. Right click on the tomcat and remove it.
  5. Delete the tomcat from the eclipse run times
  6. Add tomcat server to the eclipse servers again
  7. Start the application

 

Spring Security

I have written about integrating Spring Security with Spring MVC earlier – https://javashine.wordpress.com/tag/spring-security/

Here is another step by step by instructions. This blog post assumes you already have a Spring MVC working in your workspace. This one uses annotation based configurations.

I have a simple test web application with two URLs.

/ (root URL)

/add_expense

While I’ll leave my / url unprotected, I want to secure /add_expense. Here is how we do it.

Adding Spring Security to Spring4 MVC

This is my project structure.

springmvc_spring_security

I wrote very simple MVC controller and it is working.

Add the following to Maven project dependencies.

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.config.version}</version>
</dependency>

Under properties I’ve added this.

<spring.security.version>4.0.0.RELEASE</spring.security.version>

<spring.security.config.version>4.0.0.RELEASE</spring.security.config.version>

Following is the controller I’m going to secure. I’ll leave / open and protect /add_expense

springmvc_spring_security_1

Define a Spring security configuration. I have only one user admin.


package org.grassfield.gaja;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("password").roles("ADMIN");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/add**").access("hasRole('ROLE_ADMIN')")
.and().formLogin();
}
}

Initialize security filter chain.


package org.grassfield.gaja;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringSecurityInitializer extends
AbstractSecurityWebApplicationInitializer {

}

Load the spring security to Spring MVC Application config. Check the highlighted path.

springmvc_spring_security_2

 

And finally load everything

package org.grassfield.gaja;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpringMvcInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { ApplicationContextConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}

@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}

Capture

 

Capture

 

Capture

Capture

Way to go!

And, finally, here is the pic of the day.

CYmwbxbUQAAWCGH.jpg large
Learning something is a time machine that can bring you back to your school days!

Happy Pongal.
Happy Sankaranti.Happy Utarayan.

The request sent by the client was syntactically incorrect

This seems to be a common error during form submission in Spring WebMVC. Hence finding the root cause behind this may be difficult.

I verified step by step and confirmed that my call reaches my controller. But it breaks with the following error.

400 The request sent by the client was syntactically incorrect

Rightly pointed out at http://stackoverflow.com/questions/20616319/the-request-sent-by-the-client-was-syntactically-incorrect-spring-mvc-jdbc-te this is my date issue. I had a date field in my form. You can check my previous post on how to add jQuery date picker.

Hence, I need to make some modifications.

I added the following initBinder() method in the controller.

@RequestMapping(value="/add_expense", method=RequestMethod.POST)
    public String addExpense(@ModelAttribute ExpenseDetail expenseDetail, Model model) {
        try {
            System.out.println("===> returning add_expense"+expenseDetail.getExpenseCurrency());
            model.addAttribute("expenseList", new ExpenseDAO().getExpenseRecords());
            model.addAttribute("expenseDetail", new ExpenseDetail());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "home";
    }
    
    public void initBinder(WebDataBinder binder){
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        sdf.setLenient(true);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
    }

28-1406550815-malarmalaikal

Enjoy!

Spring mvc and jQuery DatePicker

We have added a simple CSS using the ResourceHandlers.  Now, it is the time to test jQuery on a Spring MVC. First Step is to display the calendar object on the jsp.

Spring mvc and jQuery DatePicker

Insert the scripts and CSS to head part of jsp

http://code.jquery.com/jquery-1.10.2.js
http://code.jquery.com/ui/1.11.0/jquery-ui.js

		<sc ript type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.js"></sc ript>
		<sc ript type="text/javascript" src="http://code.jquery.com/ui/1.11.0/jquery-ui.js"></sc ript>
		<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css">

Add the following javascript. Replace expenseDate with your field id

$(document).ready(function() {
$(function() {
$("#expenseDate").datepicker();
});
});

Thats all. The calendar object should rendered on the browser window.

Adding css ResourceHandlers in Spring

Task

CSS to be added to the Spring 4 JSPs

Steps

  1. Create folder called resources\theme1\css under webapp. (I use maven project)
    Adding css ResourceHandlers in Spring.PNG
  2. Create main.css under css folder
  3. Add the resource handler in the Application context config
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "org.grassfield.gaja" })
public class ApplicationContextConfig extends WebMvcConfigurerAdapter {
    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        System.out.println("---> returning viewResolver");
        return viewResolver;
    }
    
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").
        addResourceLocations("/resources/theme1/").
        setCachePeriod(31556926);
        System.out.println("---> returning resourcehandlers");
    }
}

21BGMCUBE_1904636e

 

 

Neither BindingResult nor plain target object for bean name ‘command’ available as request

Problem:

A JSP with spring form is not rendered properly.

<form:form action=”add_expense”>
<form:label path=”expenseDate”>Expense Date</form:label>
<form:input path=”expenseDate” />
<input type=”submit” />
</form:form>

28-1406551309-touristplaces

Error Message:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name ‘command’ available as request attribute

Solution

I set the request attribute in a different name in the Controller bean.

modelAndView.addObject(“expenseDetail”, new ExpenseDetail());
return modelAndView;

I set the required parameter by name expenseDetail. Hence the form tag was re-written as given below.

<form:form action=”add_expense” commandName=”expenseDetail”>

ModelAndView object is not printed on JSP

I am bundling my ModelAndView with my output as below.

modelAndView.addObject("expenseList", new ExpenseDAO().getExpenseRecords());

When I try to retrieve it in jsp as ${expenseList}, it is just printed as ${expenseList}, not the real value.

WR_20140702011432

Thanks to mkyong who mentioned that it is disabled in jsp 1.x. We need to enable EL explicitly with the follwing tag.

<%@ page isELIgnored="false" %>

Spring 4 MVC + Spring 3 Security + Hibernate 4 – integration with java annotations

Dear folks,

This may be the final post in the Spring 4 environment setup. We have already completed 3 out of 4 stages.

Last but not least, we do the hibernate integration in this post. Since ibatis is not doing good, Hibernate is monopolize the ORM market. Hence hibernate will be used in our next project. Here comes the integration. This tutorial assumes you have completed all the above steps and have the web project ready now.

hibernate.properties

Save this property file to the class path. I usually save at /src folder

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/vriksha
jdbc.username = root
jdbc.password =
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true

Changes to WebMvcConfigurerAdapter

We are doing important changes to the MVC Configurer. Please check all the methods and beans except getViewResolver(), which exists from the beginning.

package org.grassfield.conf;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "org.grassfield.conf", "org.grassfield.common.dao", "org.grassfield.common.entity" })
@EnableTransactionManagement
@PropertySource(value={"classpath:hibernate.properties"})
public class ApplicationContextConfig extends WebMvcConfigurerAdapter {
    
    @Autowired
    private Environment environment;

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Bean(name = "datasource")
    public static DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/license_prod_2");
        ds.setUsername("root");
        ds.setPassword("");

        return ds;
    }
    
    @Bean
    public LocalSessionFactoryBean sessionFactory(){
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[]{"org.grassfield.common.entity"});
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
        
    }
    
    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        return properties;        
    }
    
    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
        HibernateTransactionManager tx = new HibernateTransactionManager();
        tx.setSessionFactory(sessionFactory);
        return tx;
    }
}

 

Changes to HomeController

HomeController exists from the beginning. We are changing the method which handles the /protect url. This is secured by Spring Security. Please note the DAO call and ModelAndView population. Wiring Controller with a DAO is a bad practice. Don’t do it in your project, dear coders!

@RequestMapping("/protect")
    public ModelAndView handleProtectedRequest(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        List<UserRole> userRoleList = this.userRoleDAO.list();
        System.out.println(userRoleList);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("protect");
        modelAndView.addObject("userRoleList", userRoleList);
        return modelAndView;
    }

 

New DAO tier

We will be getting a list of user roles. Following is the interface for UserRoleDAO.

package org.grassfield.common.dao;

import java.util.List;

import org.grassfield.common.entity.UserRole;

public interface IUserRoleDAO {
    public List<UserRole> list();
}

 

The implementation goes like this. Please note the annotations.

package org.grassfield.common.dao;

import java.util.List;

import org.grassfield.common.entity.UserRole;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
public class UserRoleDAO implements IUserRoleDAO {
    @Autowired
    private SessionFactory sessionFactory;
    
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    @Transactional
    public List<UserRole> list() {
        Session currentSession = this.sessionFactory.getCurrentSession();
        @SuppressWarnings("unchecked")
        List<UserRole> list = currentSession.createQuery("From UserRole").list();
        return list;
    }
}

Entity/Model

And finally, our entity class is given below. Please note the annotations.

/*
 * Package: com.eginnovations.common.entity 
 * FileName: UserRole.java
 * (c) 2010 eG Innovations private limited
 * 
 * Created by pandian on May 27, 2010 3:15:36 PM
 */
package org.grassfield.common.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * The Class UserRole.
 */
@Entity
@Table(name="user_role")
public class UserRole {
    @Id @GeneratedValue
    @Column(name="id")
    private Long id;
    
    @Column(name="NAME")
    private String name;
    
    @Column(name="EMAIL_PERMISSION")
    private String emailPermission;
    
    /**
     * Gets the id.
     * 
     * @return the id
     */
    public Long getId() {
        return id;
    }
    
    /**
     * Sets the id.
     * 
     * @param id the new id
     */
    public void setId(Long id) {
        this.id = id;
    }
......
.....

 

Now load the protected URL! You will see the list of the user roles.

spring4_hibernate4

Okay, This is more or less ready now. I need to do some refactoring. We can start building it by next weekend. Till then Bye!

spring-tool-suite-project-logo java8-logo image00110 Apache-Tomcat-logo