【发布时间】:2021-09-20 19:18:18
【问题描述】:
在使用 Jsp 的 Spring Boot 中,我创建了一个员工管理系统,我们可以在其中添加、更新和删除员工。但问题是当我尝试更新表中的值时出现 NumberFormatException 错误。我也无法添加员工详细信息,所以我从数据库中将值提取到表中。问题出在 DAO.Class 中,我应该在其中进行一些更改。我尝试了很多方法,但对我没有任何作用。所以,请给我一个解决这个问题的方法。
EmployeeDao 类
package net.javaguides.ems.controller;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import net.javaguides.ems.entity.Employee;
@Service()
public class EmployeeDao
{
@Autowired
JdbcTemplate jdbcTemplate;
/*
* public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate =
* jdbcTemplate; }
*/
public List<Employee> getAllEmployees()
{
//List<Map<String,String>> data = new ArrayList<Map<String, String>>();
return jdbcTemplate.query("select * from employee", new RowMapper<Employee>()
{
public Employee mapRow(ResultSet rs, int row) throws SQLException
{
Employee emp = new Employee();
emp.setId(rs.getLong("id"));
emp.setFirstName(rs.getString("first_name"));
emp.setLastName(rs.getString("last_name"));
emp.setEmail(rs.getString("email"));
emp.setGender(rs.getString("gender"));
emp.setMarriage(rs.getString("marriage"));
emp.setBirthday(rs.getDate("birthday"));
emp.setWorkat(rs.getString("workat"));
emp.setDepartment(rs.getString("department"));
return emp;
}
});
}
public long saveEmployee(Employee p)
{
/*
* SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
* System.out.println("DOB ::"+p.getBirthday()+"::"+format1.format(p.getBirthday
* ()));
*/
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
format1.format(p.getBirthday());
/*
* String sql
* ="insert into emsystem.employee(id,birthday,department,email,first_name,gender,last_name"
* + ",marriage,workat) values" + " ('"+p.getFirstName()+"','1','2021-08-06'" +
* ",'"+p.getDepartment()+"','"+p.getEmail()+"','"+p.getLastName()+"'," +
* "'"+p.getGender()+"','"+p.getLastName()+"','"+p.getMarriage()+"','"+p.
* getWorkat()+"');";
*/
String sql="insert into employee(id,firstName,lastName,email,gender,marriage,birthday,workat,department) values "
+
"('"+p.getId()+"',"+p.getFirstName()+","+p.getLastName()+","+p.getEmail()+","+p.getGender()
+","+p.getMarriage()+","+p.getBirthday()+","+p.getWorkat()+",'"+p.getDepartment()+"')";
System.out.println("SQL ::"+sql);
return jdbcTemplate.update(sql);
// return jdbcTemplate.update(sql);
}
//@Deprecated
public Employee getEmployeeById(Long id)
{
String sql="select * from employee where id=?";
//return jdbcTemplate.queryForObject("select * from employee where id=?",new BeanPropertyRowMapper<Employee>(Employee.class), new Object[]{id});
return jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Employee>(Employee.class),new Object[]{id});
}
public long updateEmployee(Employee p)
{
String sql="update employee set firstName='"+p.getFirstName()+"', lastName="+p.getLastName()+",email="+p.getEmail()+",gender="+p.getGender()+",marriage="+p.getMarriage()+",birthday="+p.getBirthday()+",workat="+p.getWorkat()+",department='"+p.getDepartment()+"' where id="+p.getId()+"";
return jdbcTemplate.update(sql);
}
public long deleteEmployeeById(Long id)
{
String sql="delete from employee where id="+id+"";
return jdbcTemplate.update(sql);
}
}
错误
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sun Jul 11 11:01:50 IST 2021
There was an unexpected error (type=Bad Request, status=400).
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "{id}(id=1)"
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "{id}(id=1)"
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:133)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:228)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.lang.NumberFormatException: For input string: "{id}(id=1)"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Long.parseLong(Long.java:714)
at java.base/java.lang.Long.valueOf(Long.java:1166)
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:214)
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:429)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:402)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155)
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73)
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53)
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:696)
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125)
... 47 more
控制器
package net.javaguides.ems.controller;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import net.javaguides.ems.entity.Employee;
@Controller // Controller Layer holds all Spring MVC Controllers
public class EmployeeController {
@Autowired
EmployeeDao employeeDao;
/*
* @GetMapping("/") //from this method will call findPaginated method -> this
* will return paginated Employees. public String viewHomePage(Model model) {
* return findPaginated(1, model); }
*/
//handler method to handle list employees and return mode and view
@GetMapping("/employees")
public String listEmployees(Model model)
{
model.addAttribute("employees", employeeDao.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,
BindingResult bindingResult)
{
//Here, we r using ModelAttribute to directly bind form data to the employee object.
if (bindingResult.hasErrors())
{
return "create_employee";
}
else
{
employeeDao.saveEmployee(employee);
return "redirect:/employees";
}
}
@GetMapping("/employees/edit/{id}")
public String editEmployeeForm(@PathVariable Long id, Model model) //PathVariable Annotation is to get the id.
{
model.addAttribute("employee", employeeDao.getEmployeeById(id));
return "edit_employee";
}
@PostMapping("/employees/{id}")
public String updateEmployee(@PathVariable Long id,
@ModelAttribute("employee") Employee employee, BindingResult bindingResult, Model model)
{
// save updated employee object
if (bindingResult.hasErrors())
{
return "create_employee";
}
else
{
// get employee from database by id
Employee existingEmployee = employeeDao.getEmployeeById(id);
existingEmployee.setId(id);
existingEmployee.setFirstName(employee.getFirstName());
existingEmployee.setLastName(employee.getLastName());
existingEmployee.setEmail(employee.getEmail());
existingEmployee.setGender(employee.getGender());
existingEmployee.setMarriage(employee.getMarriage());
existingEmployee.setBirthday(employee.getBirthday());
existingEmployee.setWorkat(employee.getWorkat());
existingEmployee.setDepartment(employee.getDepartment());
employeeDao.updateEmployee(existingEmployee);
return "redirect:/employees";
}
}
// handler method to handle delete employee request
@GetMapping("/employees/{id}")
public String deleteEmployee(@PathVariable Long id)
{
employeeDao.deleteEmployeeById(id);
return "redirect:/employees";
}
}
数据库配置
package net.javaguides.ems;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Configuration
public class DBConfiguration {
@Autowired
private Environment env;
@Bean(name="dataSource")
public DataSource getDatasource() {
DriverManagerDataSource datasource = new DriverManagerDataSource();
//DataSource datasource = new DataSource();
datasource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));//this.dbDriver
datasource.setUrl(env.getProperty("spring.datasource.url"));//this.dbURL
datasource.setUsername(env.getProperty("spring.datasource.username"));//this.dbUserName
datasource.setPassword(env.getProperty("spring.datasource.password"));//this.dbPassword
return datasource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
/*
* @Bean("resourceBundle") public ResourceBundle resourceBundle() {
* ResourceBundle rb = ResourceBundle.getBundle("query"); return rb; }
*/
}
【问题讨论】:
-
查看异常,问题似乎出在 Spring MVC 试图调用您的控制器时。你能分享控制器的代码和你发送给它的 HTTP 请求的详细信息吗?
-
@AndyWilkinson 请再次检查代码。我添加了 Controller 类和 DBconfiguration 类。
标签: html spring-boot spring-mvc jsp