I am making a spring mvc project and getting this error. Have checked everything multiple times but getting through it. Please have a look at my code and help me identify with where and what I am doing wrong. Have checked paths and file locations thoroughly, they are at right place.
My first page is index.jsp which is supposed to open login.jsp but I am getting this error at return "login"; org.apache.tiles.request.render.CannotRenderException: Cannot render an attribute that is not a string, toString returns: null
index.jsp :
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<a href="${pageContext.request.contextPath}/register">Click here to Register</a>
</body>
</html>
register.jsp :
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<h1>Register</h1>
<form action="${pageContext.request.contextPath}/register" method="post">
<label>Username:</label>
<input type="text" name="username" required><br>
<label>Password:</label>
<input type="password" name="password" required><br>
<button type="submit">Register</button>
</form>
</body>
</html>
RegisterController :
package com.jpa.springdemo.controller;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.jpa.springdemo.entity.User;
import com.jpa.springdemo.service.UserService;
@Controller
public class RegisterController {
@Autowired
private UserService userService;
@RequestMapping(value = "/")
public String showHomePage() {
return "home";
}
@GetMapping("/register")
public String showRegisterForm(Model model) {
System.err.println("get");
model.addAttribute("user", new User());
return "register";
}
@PostMapping("/register")
public String processRegistrationForm(@Valid @ModelAttribute("user") User user, BindingResult result) {
if (result.hasErrors()) {
return "register";
}
userService.save(user);
return "home";
}
}
Tiles.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<!-- Layout for Public pages -->
<definition name="home">
<put-attribute name="title" value="Home" />
<put-attribute name="body" value="/WEB-INF/views/index.jsp" />
</definition>
<definition name="login">
<put-attribute name="title" value="Login" />
<put-attribute name="body" value="/WEB-INF/views/login.jsp" />
</definition>
<definition name="register">
<put-attribute name="title" value="Register" />
<put-attribute name="body" value="/WEB-INF/views/register.jsp" />
</definition>
</tiles-definitions>
WebConfig :
package com.jpa.springdemo.config;
import java.util.Locale;
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.support.ReloadableResourceBundleMessageSource;
import org.springframework.core.env.Environment;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
@EnableWebMvc
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "com.jpa.springdemo")
public class WebConfig implements WebMvcConfigurer {
@Autowired
Environment environment;
/*
* @Bean public ViewResolver getViewResolver() { InternalResourceViewResolver
* resolver = new InternalResourceViewResolver();
* resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return
* resolver; }
*/
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions(new String[] { "/WEB-INF/tiles-defs/tiles.xml" });
tilesConfigurer.setCheckRefresh(true);
return tilesConfigurer;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
TilesViewResolver viewResolver = new TilesViewResolver();
registry.viewResolver(viewResolver);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
//multipartResolver.setMaxUploadSize(1000000);
return multipartResolver;
}
@Bean(name = "localeResolver")
public CookieLocaleResolver getCookieLocaleResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setCookieName("myAppLocaleCookie");
// localeResolver.setDefaultLocale(Locale.forLanguageTag("hi_IN"));
localeResolver.setDefaultLocale(new Locale("hi", "IN"));
localeResolver.setCookieMaxAge(3600);
return localeResolver;
}
@Bean(name = "localeInterceptor")
public LocaleChangeInterceptor getLocaleInterceptor() {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
return interceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLocaleInterceptor());
}
/*
* @Override public void addViewControllers(ViewControllerRegistry registry) {
* registry.addViewController("/").setViewName("index"); }
*/
@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageBundle = new ReloadableResourceBundleMessageSource();
messageBundle.setBasenames("classpath:i18n/Transactions", "classpath:i18n/ValidationMessages");
messageBundle.setDefaultEncoding("UTF-8");
return messageBundle;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
tiles dependency in pom.xml
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>3.0.8</version>
</dependency>