当我尝试更新表中的值时,我得到 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)"的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 触发器用于在更新当前表中的值时更新另一个表

如何使用 Java Spring Boot 在不插入新值的情况下更新表中的现有值

SQL 更新多个表中的值

在同一类中获得更改的值?

发送空值时,mongodb中的日期字段未得到更新

提交后数据库表中的值没有更新