How to use LocalDateTime - spring-boot

what is the right way to solve LocalDateTime error?
I am new to spring therefore I have tried to look for the way to solve this online but I cannot get around it.
This is my entity
package com.reserve.entities;
import java.time.LocalDateTime;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
#Entity
public class Flight extends AbstractEntity {
private String flightNumber;
private String operatingAirlines;
private String departureCity;
private String arrivalCity;
#DateTimeFormat(iso=ISO.DATE)
private Date dateOfDeparture;
#Column(name="estimatedDepartureTime",columnDefinition="TIMESTAMP")
private LocalDateTime estimatedDepartureTime;
public String getFlightNumber() {
return flightNumber;
}
public void setFlightNumber(String flightNumber) {
this.flightNumber = flightNumber;
}
public String getOperatingAirlines() {
return operatingAirlines;
}
public void setOperatingAirlines(String operatingAirlines) {
this.operatingAirlines = operatingAirlines;
}
public String getDepartureCity() {
return departureCity;
}
public void setDepartureCity(String departureCity) {
this.departureCity = departureCity;
}
public String getArrivalCity() {
return arrivalCity;
}
public void setArrivalCity(String arrivalCity) {
this.arrivalCity = arrivalCity;
}
public Date getDateOfDeparture() {
return dateOfDeparture;
}
public void setDateOfDeparture(Date dateOfDeparture) {
this.dateOfDeparture = dateOfDeparture;
}
public LocalDateTime getEstimatedDepartureTime() {
return estimatedDepartureTime;
}
public void setEstimatedDepartureTime(LocalDateTime estimatedDepartureTime) {
this.estimatedDepartureTime = estimatedDepartureTime;
}
#Override
public String toString() {
return "Flight [flightNumber=" + flightNumber + ", operatingAirlines=" + operatingAirlines + ", departureCity="
+ departureCity + ", arrivalCity=" + arrivalCity + ", dateOfDeparture=" + dateOfDeparture
+ ", estimatedDepartureTime=" + estimatedDepartureTime + "]";
}
}
This is my controller.
I am not sure which information is required.
Please let me know if there are more information that could help.
package com.reserve.controllers;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.reserve.entities.Flight;
import com.reserve.repository.FlightRepository;
#Controller
public class FlightController {
#Autowired
private FlightRepository flightRepository;
#RequestMapping("findFlights")
public String findFlights(
#RequestParam("from")String from,
#RequestParam("to")String to,
#RequestParam("departureDate")
#DateTimeFormat(pattern = "MM-dd-yyyy")
Date departureDate,
Model model)
{
List<Flight> flights = flightRepository.findFlights(from,to,departureDate);
model.addAttribute("flights", flights);
return "displayFlights";
}
#RequestMapping("/ourFlights")
public String ourFlights() {
return "ourFlights";
}
#RequestMapping(value="/add", method=RequestMethod.POST)
public String addFlights(#ModelAttribute("flight")Flight flight,Model model) {
Flight save = flightRepository.save(flight);
String msg = save.getFlightNumber() + " from " + save.getDepartureCity() + " to "
+ save.getArrivalCity() + " has been added.";
model.addAttribute("msg", msg);
return "ourFlights";
}
}
This is my JSP file
<%# page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%#taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%#page isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Money Wise</title>
<link rel="stylesheet" href="/reserve/css/bootstrap.min.css"/>
<link rel="stylesheet" href="/reserve/css/custom.css"/>
</head>
<body>
<div class="container">
<div id="body">
<nav class="navbar navbar-expand-lg navbar-light bg-lights">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="home">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Ideology</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Faq</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">News</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0 pull-right">
<input class="form-control mr-sm-2" type="search" placeholder="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
<!-- Site Body -->
<div id="content" class="container">
<div class="row">
<div id="leftMain" class="col-sm-3">
<img src="/reserve/images/jim.png"width=100%/>
</div>
<div id="mainBody" class="col-sm-9 ">
<h2>Add Flights</h2>
<form action="add" method="post">
<div class="form-group">
<label for="flightNumber">Flight number</label>
<input type="text" class="form-control" name="flightNumber" placeholder="Flight number"/>
</div>
<div class="form-group">
<label for="operatingAirlines">Operating airlines</label>
<input type="text" class="form-control" name="operatingAirlines" placeholder="Operating airlines"/>
</div>
<div class="form-group">
<label for="departureCity">Departure city</label>
<input type="text" class="form-control" name="departureCity" placeholder="Departure city"/>
</div>
<div class="form-group">
<label for="arrivalCity">Arrival city</label>
<input type="text" class="form-control" name="arrivalCity" placeholder="Arrival city"/>
</div>
<div class="form-group">
<label for="dateOfDeparture">Date of departure</label>
<input type="Date" class="form-control" name="dateOfDeparture" placeholder="Date of departure"/>
</div>
<div class="form-group">
<label for="estimatedDepartureTime">Estimated departure time</label>
<input type="datetime-local" class="form-control" name="estimatedDepartureTime" placeholder="Estimated departure time"/>
</div>
<button type="submit" class="btn btn-primary">Save</button>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- JS, Popper.js, and jQuery -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js#1.16.0/dist/umd/popper.min.js"></script>
<script src="/reserve/js/bootstrap.min.js"></script>
</body>
</html>
This is the error I get
Field error in object 'flight' on field 'estimatedDepartureTime': rejected value [2020-06-20T17:35]; codes
[typeMismatch.flight.estimatedDepartureTime,typeMismatch.estimatedDepartureTime,typeMismatch.java.time.LocalDateTime,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:
codes [flight.estimatedDepartureTime,estimatedDepartureTime]; arguments []; default message [estimatedDepartureTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDateTime' for property 'estimatedDepartureTime';
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type
[java.lang.String] to type [#javax.persistence.Column java.time.LocalDateTime] for value '2020-06-20T17:35'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2020-06-20T17:35]]]
``````

You can try to use Spring The Formatter SPI to convert Date expressed as String to LocalDateTime and vice versa.
public class DateTimeFormatters {
public static class LocalDateTimeFormatter implements Formatter<LocalDateTime> {
#Override
public LocalDateTime parse(String pattern, Locale locale) throws ParseException {
return LocalDateTime.parse(pattern, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
#Override
public String print(LocalDateTime object, Locale locale) {
return object.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
}
}
And register your Formatter e.g
public class ApplicationConfig implements WebMvcConfigurer {
...
#Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new DateTimeFormatters.LocalDateTimeFormatter());
}
...
}

Related

In browser i couldn't get Boot Strap tables instead i get white label error

In Spring Boot, earlier, I've created Employee Management System Table with 4 Columns -> firtsname, lastname, email and Actions column where it has Update&Delete Buttons. now, I've added extra 3 Columns -> gender, birthday, skill. Everything works fine, there is no compilation Errors and console errors but when i hit the browser i get whitelabel error. can anyone please give me a solution for this problem.
1.Employee Entity.Class
package com.employee.entity;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
#Entity
#Table(name = "employees")
public class Employee
{
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String firstname;
private String lastname;
private String email;
private String gender;
private Date birthday;
private String skill;
public Employee() {
}
public Employee(long id, String firstname, String lastname, String email, String gender, Date birthday,
String skill) {
super();
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
this.gender = gender;
this.birthday = birthday;
this.skill = skill;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
2.EmployeeController.class
package com.employee.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import com.employee.entity.Employee;
import com.employee.service.EmployeeService;
#Controller // Controller Layer holds all Spring MVC Controllers
public class EmployeeController
{
private EmployeeService employeeService;
public EmployeeController(EmployeeService employeeService) {
super();
this.employeeService = employeeService;
}
#GetMapping("/employees")
public String listEmployess(Model model)
{
model.addAttribute("employees", employeeService.getAllEmployees());
return "employees";
}
#GetMapping("/employees/new")
public String createEmployeeForm(Model model)
{
//Create empty employee object to hold employee form data
Employee employee = new Employee();
model.addAttribute("employee", employee);
return "create_employee";
}
#PostMapping("/employees")
public String saveEmployee(#ModelAttribute("employee") Employee employee)
{
employeeService.saveEmployee(employee);
return "redirect:/employees";
}
#GetMapping("/employees/edit/{id}")
public String editEmployeeForm(#PathVariable Long id, Model model)
{
model.addAttribute("employee", employeeService.getEmployeeById(id));
return "edit_employee";
}
#PostMapping("/employees/{id}")
public String updateEmployee(#PathVariable Long id, #ModelAttribute("employee") Employee employee, Model model)
{
// get employee from database by id
Employee existingEmployee = employeeService.getEmployeeById(id);
//existingEmployee.setId(id);
existingEmployee.setFirstname(employee.getFirstname());
existingEmployee.setLastname(employee.getLastname());
existingEmployee.setEmail(employee.getEmail());
existingEmployee.setGender(employee.getGender());
existingEmployee.setBirthday(employee.getBirthday());
existingEmployee.setSkill(employee.getSkill());
// save updated employee object
employeeService.updateEmployee(existingEmployee);
return "redirect:/employees";
}
#GetMapping("/employees/{id}")
public String deleteEmployee(#PathVariable Long id)
{
employeeService.deleteEmployeeById(id);
return "redirect:/employees";
}
}
3.EmployeeRepository.interface
package com.employee.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.employee.entity.Employee;
#Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long>
{
}
4.EmployeeService.interface
package com.employee.service;
import java.util.List;
import com.employee.entity.Employee;
public interface EmployeeService
{
public List<Employee> getAllEmployees();
Employee saveEmployee(Employee employee);
Employee getEmployeeById(Long id);
Employee updateEmployee(Employee employee);
void deleteEmployeeById(Long id);
}
5.EmployeeServiceImpl.class
package com.employee.service.impl;
import java.util.List;
import org.springframework.stereotype.Service;
import com.employee.entity.Employee;
import com.employee.repository.EmployeeRepository;
import com.employee.service.EmployeeService;
#Service
public class EmployeeServiceImpl implements EmployeeService
{
private EmployeeRepository employeeRepository;
public EmployeeServiceImpl(EmployeeRepository employeeRepository) {
super();
this.employeeRepository = employeeRepository;
}
#Override
public List<Employee> getAllEmployees()
{
return employeeRepository.findAll();
}
#Override
public Employee saveEmployee(Employee employee)
{
return employeeRepository.save(employee);
}
#Override
public Employee getEmployeeById(Long id) {
return employeeRepository.findById(id).get();
}
#Override
public Employee updateEmployee(Employee employee) {
return employeeRepository.save(employee);
}
#Override
public void deleteEmployeeById(Long id)
{
employeeRepository.deleteById(id);
}
}
6.application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/ems?useSSL=false&serverTime=UTC&useLegacyDatetimeCode=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1441
server.port=8097
#spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
#spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.thymeleaf.check-template=true
spring.thymeleaf.check-template-location=true
spring.thymeleaf.enabled=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
debug=true
logging.level.org.hibernate.SQL=DEBUG
#logging.level.<package_name>=<LOGGING_LEVEL>
#logging.level.org.springframework.context=DEBUG
spring.profiles.active=#spring.profiles.active#
spring.jpa.open-in-view=false
logging.level.org.springframework.boot.autoconfigure=ERROR
7.employees.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
</head>
<body>
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
<!-- Brand -->
<a class="navbar-brand" href="#">Employee Management System</a>
<!-- Toggler/collapsibe Button -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" th:href="#{/employees}">Employee Management</a>
</li>
</ul>
</div>
</nav>
<div class ="container">
<div class = "row">
<h1> List Employees </h1>
</div>
<div class = "row" >
<div class = "col-lg-3">
<a th:href = "#{/employees/new}" class = "btn btn-primary btn-sm mb-3"> Add Employee</a>
</div>
</div>
<table class = "table table-striped table-bordered" >
<thead class = "table-dark">
<tr>
<th> Employee First Name </th>
<th> Employee Last Name </th>
<th> Employee Email </th>
<th> Employee Gender </th>
<th> Employee Birthday </th>
<th> Employee Skill </th>
<th> Actions </th>
</tr>
</thead>
<tbody>
<tr th:each = "employee : ${employees}">
<td th:text = "${employee.firstname}"></td>
<td th:text = "${employee.lastname}"></td>
<td th:text = "${employee.email}"></td>
<td th:text = "${employee.gender}"></td>
<td th:text = "${employee.birthday}"></td>
<td th:text = "${employee.skill}"></td>
<td>
<a th:href = "#{/employees/edit/{id}(id=${employee.id})}"
class = "btn btn-primary">Update</a>
<a th:href = "#{/employees/{id}(id=${employee.id})}"
class = "btn btn-danger">Delete</a>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
8.create_employee.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Employee Management System</title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
</head>
<body>
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
<!-- Brand -->
<a class="navbar-brand" href="#">Employee Management System</a>
<!-- Toggler/collapsibe Button -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" th:href="#{/employees}">Employee Management</a>
</li>
</ul>
</div>
</nav>
<br>
<br>
<div class = "container">
<div class = "row">
<div class = "col-lg-6 col-md-6 col-sm-6 container justify-content-center-center card">
<h1 class = "text-center"> Create New Employee </h1>
<div class = "card-body" >
<form th:action="#{/employees}" th:object = "${employee}" method="POST">
<div class = "form-group">
<label> Employee First Name </label>
<input
type = "text"
name = "firstname"
th:field = "*{firstname}"
class = "form-control"
placeholder = "Enter Employee First Name"
/>
</div>
<div class = "form-group">
<label> Employee Last Name </label>
<input
type = "text"
name = "lastname"
th:field = "*{lastname}"
class = "form-control"
placeholder = "Enter Employee Last Name"
/>
</div>
<div class = "form-group">
<label> Employee Email </label>
<input
type = "text"
name = "email"
th:field = "*{email}"
class = "form-control"
placeholder = "Enter Employee Email"
/>
</div>
<div class = "form-group">
<label> Employee Gender </label>
<input type="radio" th:field="*{gender}" value="Male" />Male
<input type="radio" th:field="*{gender}" value="Female" />Female
<input
type = "radio"
name = "gender"
th:field = "*{gender}"
class = "form-control"
/>
</div>
<div class = "form-group">
<label> Employee Birthday </label>
<input type="date" th:field="*{birthday}" />
<input
type = "date"
name = "birthday"
th:field = "*{birthday}"
class = "form-control"
/>
</div>
<div class = "form-group">
<label> Employee Skill </label>
<input
type = "text"
name = "skill"
th:field = "*{skill}"
class = "form-control"
placeholder = "Enter Employee Skill"
/>
</div>
<div class = "box-footer">
<button type="submit" class = "btn btn-primary">
Submit
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
9.edit_employee.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Employee Management System</title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
</head>
<body>
<nav class="navbar navbar-expand-md bg-dark navbar-dark">
<!-- Brand -->
<a class="navbar-brand" href="#">Employee Management System</a>
<!-- Toggler/collapsibe Button -->
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" th:href="#{/employees}">Employee Management</a>
</li>
</ul>
</div>
</nav>
<br>
<br>
<div class = "container">
<div class = "row">
<div class = "col-lg-6 col-md-6 col-sm-6 container justify-content-center-center card">
<h1 class = "text-center"> Create New Employee </h1>
<div class = "card-body" >
<form th:action="#{/employees/{id} (id=${employee.id})}" th:object = "${employee}" method="POST">
<div class = "form-group">
<label> Employee First Name </label>
<input
type = "text"
name = "firstname"
th:field = "*{firstname}"
class = "form-control"
placeholder = "Enter Employee First Name"
/>
</div>
<div class = "form-group">
<label> Employee Last Name </label>
<input
type = "text"
name = "lastname"
th:field = "*{lastname}"
class = "form-control"
placeholder = "Enter Employee Last Name"
/>
</div>
<div class = "form-group">
<label> Employee Email </label>
<input
type = "text"
name = "email"
th:field = "*{email}"
class = "form-control"
placeholder = "Enter Employee Email"
/>
</div>
<div class = "form-group">
<label> Employee Gender </label>
<input type="radio" th:field="*{gender}" value="Male" />Male
<input type="radio" th:field="*{gender}" value="Female" />Female
<input
type = "radio"
name = "gender"
th:field = "*{gender}"
class = "form-control"
/>
</div>
<div class = "form-group">
<label> Employee Birthday </label>
<input type="date" th:field="*{birthday}" />
<input
type = "date"
name = "birthday"
th:field = "*{birthday}"
class = "form-control"
/>
</div>
<div class = "form-group">
<label> Employee Skill </label>
<input
type = "text"
name = "skill"
th:field = "*{skill}"
class = "form-control"
placeholder = "Enter Employee Skill"
/>
</div>
<div class = "box-footer">
<button type="submit" class = "btn btn-primary">
Submit
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
You just need to add mapping for /, which will redirect to the landing page (in your case employees page).
So, just add the following GET mapping in your EmployeeController
#GetMapping('/')
public String index() {
return "redirect:/employees";
}

Themeleaf issue with can not be null variable

I was trying to send the posts to DB. However,when I tried to use themeleaf, it shows me the following error:
EL1007E: Property or field 'name' cannot be found on null Exception evaluating SpringEL expression: "name" (template: "StudentForm" - line 264, col 49) An error happened during template parsing (template: "class path resource [templates/StudentForm.html]")
This is what I tried below:
StudentForm.html
<div class="col-lg-10">
<div class="card">
<div class="card-header">
<strong>Basic Form</strong> Elements
</div>
<div class="card-body card-block">
<form th:action="#{/StudentForm}" th:Object="${student}" method="post" enctype="multipart/form-data" class="form-horizontal" role="form">
<div class="row form-group">
<div class="col col-md-3">
<label for="text-input" th:field="*{name}" class=" form-control-label">Ismi sharifi</label>
</div>
<div class="col-12 col-md-9">
<input type="text" id="text-input" placeholder="Iltimos ismni kiriting" class="form-control">
</div>
</div>
<div class="row form-group">
<div class="col col-md-3">
<label for="select" class=" form-control-label">Fakulteti</label>
</div>
<!-- <div class="col-12 col-md-9">
<select name="select" id="select" class="form-control">
<option value="0">Fakultetni tanlang</option>
<option value="1">Option #1</option>
<option value="2">Option #2</option>
<option value="3">Option #3</option>
</select>
</div>
</div> -->
<div class="row form-group">
<div class="col col-md-3">
<label for="email-input" class=" form-control-label">Email Input</label>
</div>
<div class="col-12 col-md-9">
<input type="email" id="email-input" th:field="*{email}" placeholder="Emailni kiriting" class="form-control">
<small class="help-block form-text"></small>
</div>
</div>
<div class="row form-group">
<div class="col col-md-3">
<label for="text-input" class=" form-control-label">To'langan summa</label>
</div>
<div class="col-12 col-md-9">
<input type="text" id="text-input" placeholder="Summani kiriting" class="form-control">
</div>
</div>
<div class="row form-group">
<div class="col col-md-3">
<label for="file-input" class=" form-control-label">File input</label>
</div>
<div class="col-12 col-md-9">
<input type="file" id="file-input" name="file-input" class="form-control-file">
</div>
</div>
</form>
</div>
<div class="card-footer">
<button type="submit" class="btn btn-primary btn-sm">
<i class="fa fa-dot-circle-o"></i> Yuklash
</button>
<button type="reset" class="btn btn-danger btn-sm">
<i class="fa fa-ban"></i> Reset
</button>
</div>
</div>
StudentController.java
package io.javabrains;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import io.javabrains.Entities.Student;
import io.javabrains.repository.StudentRepository;
import io.javabrains.service.StudentService;
#Controller
public class StudentController {
#Autowired
private StudentRepository repository;
#Autowired
private StudentService service;
#RequestMapping(value= {"/student"},method=RequestMethod.GET)
public ModelAndView student(HttpServletRequest request) {
request.setAttribute("Student", service.findAll());
request.setAttribute("mode", "MODE_TASKS");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("student");
return modelAndView;
}
#RequestMapping(value="/StudentForm",method=RequestMethod.POST)
public ModelAndView studentForm(#Valid Student student,BindingResult bindingResult,ModelMap modelMap)
{
ModelAndView modelAndView = new ModelAndView();
service.addStudent(student);
modelAndView.addObject("student",new Student());
modelAndView.setViewName("studentForm");
return modelAndView;
}
#RequestMapping(value={"/StudentForm"},method=RequestMethod.GET)
public ModelAndView studentForm() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("StudentForm");
return modelAndView;
}
public List<Student>getAllEmployers(){
return service.findAll();
}
StudentEntity.java
package io.javabrains.Entities;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
#Entity
#Table(name = "student")
public class Student {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "studentId")
private int studentId;
#Column(name="name")
#NotNull(message = "Name is compulsort")
private String Name;
#Column(name="email")
#NotNull(message = "Email is compulsory")
private String Email;
#Column(name="department")
#NotNull(message = "department is compulsort")
private String Department;
#Column(name="amount")
#NotNull(message = "Amount is compulsort")
private double Amount;
#ManyToOne
#JoinColumn(name="studentId",referencedColumnName="id",insertable=false, updatable=false)
private DepartmentCategory departmentCategory;
First of all your controller should contain get method which returns Student object as a form to bind. You missed that. It should look something like this:
#RequestMapping(value={"/StudentForm"},method=RequestMethod.GET)
public ModelAndView studentForm() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("student", new Student()) //returns object to thymeleaf context
modelAndView.setViewName("StudentForm");
return modelAndView;
}
then you should change your naming convention in your student class, fields should start with lower case. You should notice that you have field Name in your Student class but you want to map th:field="*{name}" in thymeleaf view.
Read something about DTO and Models because you shouldn't use your entities directly in controller layer

Could Not register the user in database using JPA

I am trying to insert an User by http://localhost:8080/register to register a new User.But when i am clicking the register button it shows me the hibernate error such as "There was an unexpected error (type=Internal Server Error, status=500).could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement".
welcome.jsp
<!DOCTYPE html >
<%#taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div role="navigation">
<div class="navbar navbar-inverse">
Tecno-Tab
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>Login</li>
<li>New Registration</li>
<li>All Users</li>
</ul>
</div>
</div>
</div>
<c:choose>
<c:when test="${mode=='MODE_HOME'}">
<div class="container" id="homediv">
<div class="jumbotron text-center">
<h1>Welcome to Tecno-tab</h1>
<h3>Subscribe my channel to support me</h3>
</div>
</div>
</c:when>
<c:when test="${mode=='MODE_REGISTER'}">
<div class="container text-center">
<h3>New Registration</h3>
<hr>
<form class="form-horizontal" method="POST" action="save-user">
<input type="hidden" name="id" value="${user.id }" />
<div class="form-group">
<label class="control-label col-md-3">Username</label>
<div class="col-md-7">
<input type="text" class="form-control" name="username"
value="${user.userName}" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">First Name</label>
<div class="col-md-7">
<input type="text" class="form-control" name="firstname"
value="${user.firstName}" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">Last Name</label>
<div class="col-md-7">
<input type="text" class="form-control" name="lastname"
value="${user.lastName}" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">Age </label>
<div class="col-md-3">
<input type="text" class="form-control" name="age"
value="${user.age}" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">Password</label>
<div class="col-md-7">
<input type="password" class="form-control" name="password"
value="${user.passWord}" />
</div>
</div>
<div class="form-group ">
<input type="submit" class="btn btn-primary" value="Register" />
</div>
</form>
</div>
</c:when>
</c:choose>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="static/js/jquery.min.js"></script>
<script src="static/js/bootstrap.min.js"></script>
</body>
</html>
ApplicationController.java
package com.ashwin.myapplication.controller;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ashwin.myapplication.model.User;
import com.ashwin.myapplication.service.UserService;
#Controller
public class ApplicationController {
#Autowired
private UserService userService;
#RequestMapping("/home")
public String Welcome(HttpServletRequest request) {
request.setAttribute("mode","MODE_HOME");
return "welcome";
}
#RequestMapping("/register")
public String registeration(HttpServletRequest request) {
request.setAttribute("mode","MODE_REGISTER");
return "welcome";
}
#PostMapping("/save-user")
public String saveUser(#ModelAttribute User user,
BindingResult bindingResult,HttpServletRequest request) {
userService.saveMyUser(user);
request.setAttribute("mode","MODE_HOME");
return "welcome";
}
}
User.java
package com.ashwin.myapplication.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
#Entity
#Table(name="mytable1")
public class User {
#Id
#GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
#Column(name="user_name")
private String userName;
#Column(name="first_name")
private String firstName;
#Column(name="last_name")
private String lastName;
#Column(name="age")
private int age;
#Column(name="password")
private String passWord;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public User(String firstName, String lastName, int age, String password) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.passWord = password;
}
public User() {
}
#Override
public String toString() {
return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", password="
+ passWord + "]";
}
}

select multiple not passing all the selected values

path="userRoles" is multi select field. Which is populated with the method "initializeRoles()" from the controller. I have a converter also to convert Roles to UserRoles object. When I submit the form even after selecting all the Roles, I get only the first selected one always to the converter class as shown below. Why I am not getting String[] from JSP?
Output in the Converter class:
1
string
JSP code:
<%# page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%# page isELIgnored="false" %>
<%# taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%# taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>User Create Form</title>
<link href="<c:url value='/static/css/bootstrap.css' />" rel="stylesheet"></link>
<link href="<c:url value='/static/css/app.css' />" rel="stylesheet"></link>
</head>
<body>
<div class="generic-container">
<%#include file="authheader.jsp" %>
<div class="well lead">User Create Form</div>
<form:form method="POST" modelAttribute="user" class="form-horizontal">
<form:input type="hidden" path="userid" id="userid"/>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="firstName">First Name</label>
<div class="col-md-7">
<form:input type="text" path="firstName" id="firstName" class="form-control input-sm"/>
<div class="has-error">
<form:errors path="firstName" class="help-inline"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="middleName">Middle Name</label>
<div class="col-md-7">
<form:input type="text" path="middleName" id="middleName" class="form-control input-sm" />
<div class="has-error">
<form:errors path="middleName" class="help-inline"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="lastName">Last Name</label>
<div class="col-md-7">
<form:input type="text" path="lastName" id="lastName" class="form-control input-sm" />
<div class="has-error">
<form:errors path="lastName" class="help-inline"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="username">Username</label>
<div class="col-md-7">
<c:choose>
<c:when test="${edit}">
<form:input type="text" path="username" id="username" class="form-control input-sm" disabled="true"/>
</c:when>
<c:otherwise>
<form:input type="text" path="username" id="username" class="form-control input-sm" />
<div class="has-error">
<form:errors path="username" class="help-inline"/>
</div>
</c:otherwise>
</c:choose>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="password">Password</label>
<div class="col-md-7">
<form:input type="password" path="password" id="password" class="form-control input-sm" />
<div class="has-error">
<form:errors path="password" class="help-inline"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="email">Email</label>
<div class="col-md-7">
<form:input type="text" path="email" id="email" class="form-control input-sm" />
<div class="has-error">
<form:errors path="email" class="help-inline"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
<label class="col-md-3 control-lable" for="userRoles">Roles</label>
<div class="col-md-7">
<form:select path="userRoles" items="${roles}" multiple="true" itemValue="roleid" itemLabel="roleName" class="form-control input-sm" />
<div class="has-error">
<form:errors path="userRoles" class="help-inline"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-actions floatRight">
<c:choose>
<c:when test="${edit}">
<input type="submit" value="Update" class="btn btn-primary btn-sm"/> or Cancel
</c:when>
<c:otherwise>
<input type="submit" value="Register" class="btn btn-primary btn-sm"/> or Cancel
</c:otherwise>
</c:choose>
</div>
</div>
</form:form>
</div>
</body>
</html>
Controller code:
package com.rsa.tools.springmvc.web.controller;
import java.util.List;
import java.util.Locale;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.rsa.tools.springmvc.model.User;
import com.rsa.tools.springmvc.model.UserRoles;
import com.rsa.tools.springmvc.service.UserManagementService;
#Controller
#RequestMapping("/users")
public class UserController {
#Autowired
UserManagementService umService;
#Autowired
MessageSource messageSource;
#RequestMapping(value="/list", method=RequestMethod.GET)
public String listUsers(ModelMap model) {
List<User> users = umService.getAllUsersOrderedByUsername();
model.addAttribute("users", users);
return "userslist";
}
#RequestMapping(value = { "/newuser" }, method = RequestMethod.GET)
public String newUser(ModelMap model) {
User user = new User();
model.addAttribute("user", user);
model.addAttribute("edit", false);
return "registration";
}
#RequestMapping(value = { "/newuser" }, method = RequestMethod.POST)
public String saveUser(#Valid User user, BindingResult result, ModelMap model) {
System.out.println(user);
System.out.println(result.getAllErrors());
if (result.hasErrors()) {
return "registration";
}
if(!umService.isUsernameUnique(user.getUsername())) {
FieldError usernameError = new FieldError("user","username",messageSource.getMessage("non.unique.username", new String[]{user.getUsername()}, Locale.getDefault()));
result.addError(usernameError);
return "registration";
}
umService.addUser(user);
model.addAttribute("success", "User " + user.getFirstName() + " "+ user.getLastName() + " registered successfully");
//return "success";
return "registrationsuccess";
}
#RequestMapping(value = { "/edit-user-{username}" }, method = RequestMethod.GET)
public String editUser(#PathVariable String username, ModelMap model) {
User user = umService.findByUsername(username);
model.addAttribute("user", user);
model.addAttribute("edit", true);
return "registration";
}
#RequestMapping(value = { "/edit-user-{username}" }, method = RequestMethod.POST)
public String updateUser(#Valid User user, BindingResult result, ModelMap model, #PathVariable String username) {
if (result.hasErrors()) {
return "registration";
}
umService.editUser(user);
model.addAttribute("success", "User " + user.getFirstName() + " "+ user.getLastName() + " updated successfully");
return "registrationsuccess";
}
#RequestMapping(value = { "/delete-user-{username}" }, method = RequestMethod.GET)
public String deleteUser(#PathVariable String username) {
umService.deleteUser(username);
return "redirect:/list";
}
#ModelAttribute("roles")
public List<UserRoles> initializeRoles() {
return umService.getAllUserRoles();
}
}
Converter code:
package com.rsa.tools.springmvc.configuration.web.converter;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import com.rsa.tools.springmvc.dao.UserDao;
import com.rsa.tools.springmvc.model.UserRoles;
#Component
public class UserRolesConverter implements Converter<Object, List<UserRoles>> {
#Autowired
UserDao userDao;
#Override
public List<UserRoles> convert(Object roles) {
List<UserRoles> userRoles = new ArrayList<UserRoles>();
System.out.println(roles);
if (roles instanceof String) {
System.out.println("string");
String sRoles = (String)roles;
UserRoles ur = userDao.findByRoleid(Long.parseLong(sRoles));
userRoles.add(ur);
} else if (roles instanceof String[]) {
System.out.println("string[]");
for (String role : (String[])roles) {
UserRoles ur = userDao.findByRoleid(Long.parseLong(role));
userRoles.add(ur);
}
}
return userRoles;
}
}
Web Configuration:
package com.rsa.tools.springmvc.configuration.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.format.FormatterRegistry;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import com.rsa.tools.springmvc.configuration.web.converter.UserRolesConverter;
#Configuration
#EnableWebMvc
#ComponentScan(basePackages = { "com.rsa.tools.springmvc.web.controller", "com.rsa.tools.springmvc.configuration.web.converter" })
public class ApplicationWebConfiguration extends WebMvcConfigurerAdapter {
#Autowired
UserRolesConverter userRolesConverter;
#Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
#Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}
#Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(userRolesConverter);
}
#Override
public Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource());
return validator;
}
#Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
}
Added one more converter class for String[]. Then I started getting multiple values which were selected in in UI. Why I have to write two Converter classes. Is there a way to combine both the classes.
public class UserRolesConverter1 implements Converter<String[], List<UserRoles>> {
...
#Override
public List<UserRoles> convert(String[] roles) {

How to Bind the list data thymeleaf html from to spring controller?

This is my Controller class
package com.myblog.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import com.myblog.model.User;
#Controller
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
#GetMapping(value="/user")
public String getUser(Model model){
model.addAttribute("user", new User());
return "user";
}
#PostMapping(value="/user")
public String postUser(#ModelAttribute("user") User user){
log.info("user :"+user);
return "user";
}
}
This is My Model class
user.java
package com.myblog.model;
import java.util.ArrayList;
import java.util.List;
public class User {
private int id;
private String name;
private List<Address> address=new ArrayList<Address>();
#Override
public String toString() {
return "User [name=" + name + ", address=" + address + "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Address> getAddress() {
return address;
}
public void setAddress(List<Address> address) {
this.address = address;
}
}
address.java
package com.myblog.model;
public class Address {
private int id;
private String street;
private String city;
public int getAddid() {
return addid;
}
public void setAddid(int addid) {
this.addid = addid;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
This is my thymeleaf HTML page
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Page Title</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet" media="screen" th:href="#{css/bootstrap.min.css}"/>
<script src="/static/js/bootstrap.min.js" th:src="#{js/bootstrap.min.js}"></script>
</head>
<body>
<div class="container">
<h1> User Account</h1>
<form class="form-horizontal" th:action="#{/user}" method="POST" th:object="${user}">
<div class="form-group">
<label for="inputDescription" class="col-sm-2 control-label">Full Name</label>
<div class="col-sm-5">
<input type="text" class="form-control" name="name" placeholder="Full name"/>
</div>
</div>
<div class="form-group">
<label for="inputDescription" class="col-sm-2 control-label">Address</label>
<div class="col-sm-5">
<input type="text" class="form-control" name="address.city" placeholder="City"/>
</div>
</div>
<div class="form-group">
<label for="inputDescription" class="col-sm-2 control-label">Street</label>
<div class="col-sm-5">
<input type="text" class="form-control" name="address.street" placeholder="street" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-10">
<input type="submit" class="btn btn-primary" value="Add"/>
</div>
</div>
</form>
</div>
</body>
</html>
in controller user object does not bind the data into address model object.
output is user :user[name="name",address[]]
Your form seems to only manage one adress, but your domain model specifies a list of adresses. In this case you would need to name your input fields like address[0].street for the first address and so on.
So I'd consider to use a thymleaf iterator (th:each) to make all addresses manageable in your form. Then use th:field instead of defining name attributes. This should solve your problem.
<form class="form-horizontal" th:action="#{/user}" method="POST" th:object="${user}">
<div class="form-group">
<label for="inputDescription" class="col-sm-2 control-label">Full Name</label>
<div class="col-sm-5">
<input type="text" class="form-control" th:field="*{name}" placeholder="Full name"/>
</div>
</div>
<div class="form-group">
<label for="inputDescription" class="col-sm-2 control-label">Address</label>
<div class="col-sm-5">
<input type="text" class="form-control" th:field="*{address[0].city}" placeholder="City"/>
</div>
</div>
<div class="form-group">
<label for="inputDescription" class="col-sm-2 control-label">Street</label>
<div class="col-sm-5">
<input type="text" class="form-control" th:field="*{address[0].street}" placeholder="street" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"></label>
<div class="col-sm-10">
<input type="submit" class="btn btn-primary" value="Add"/>
</div>
</div>
</form>

Resources