【问题标题】: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 类。

标签: html spring-boot spring-mvc jsp


【解决方案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 的问题
猜你喜欢
  • 2016-05-26
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多