当我尝试更新表中的值时,我得到 java.lang.NumberFormatException: For input string: "id(id=1)"
Posted
技术标签:
【中文标题】当我尝试更新表中的值时,我得到 java.lang.NumberFormatException: For input string: "id(id=1)"【英文标题】:when I try to update the values in table I get java.lang.NumberFormatException: For input string: "id(id=1)"当我尝试更新表中的值时,我得到 java.lang.NumberFormatException: For input string: "id(id=1)" 【发布时间】: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 类。 【参考方案1】:您没有包含用于发出请求的 URL,但是,看到您的控制器的代码,我认为这就是问题所在。
从错误消息来看,您正在向/employees/id(id=1)
之类的东西发出 GET 请求。您的@GetMapping
是/employees/id
,因此第二个/
之后的所有内容都成为id
的值。由于您使用了@PathVariable
,Spring MVC 尝试将"id(id=1)"
转换为Long
用于您的id
参数,但它失败了。
如果我对您发出请求的 URL 的假设是正确的,您可以通过更改您正在使用的 URL 来解决问题。假设员工的ID是1,应该是/employees/1
。
【讨论】:
我获取请求的 url 是 localhost:8080/employees 你确定吗?如果是这种情况,则不会涉及 String 到 Long 的转换。id(id=1)
输入必须来自请求。【参考方案2】:
问题是当你直接使用URL传递参数时,例如
/employees/1
无论你喜欢与否,你都在传递一个字符串。所以最好的解决方案是
(这是其中一个控制器,类似的解决方案适用于其他控制器)
@GetMapping("/employees/id")
public String deleteEmployee(@PathVariable String id)
try
Long longid = Long.valueOf(id);
catch (Exception e)
//Exception Handling here (maybe an error page, idk)
employeeDao.deleteEmployeeById(longid);
return "redirect:/employees";
另外,我强烈建议您使用自定义存储库,这样您就不需要每次都创建标准查询,如插入、删除和标准选择(查找 CrudRepository 或 JpaRepository)
【讨论】:
Spring MVC 很乐意为您将字符串”1”
转换为数字1
,无需编写代码。
我在一些项目中使用了这种方法,它特别适合异常处理,因为您可以抛出自定义异常,而不是 MethodArgumentTypeMismatchException,这通常是非常通用的
没关系,但在这种情况下没有必要,也不能解决 String
无法转换为 Long
的问题以上是关于当我尝试更新表中的值时,我得到 java.lang.NumberFormatException: For input string: "id(id=1)"的主要内容,如果未能解决你的问题,请参考以下文章