【问题标题】:Error: java.lang.NoSuchMethodException: java.lang.Long.<init>() in spring MVC错误:java.lang.NoSuchMethodException:spring MVC 中的 java.lang.Long.<init>()
【发布时间】:2026-01-19 20:15:01
【问题描述】:

我在从数据库中读取 student 对象时遇到此错误。

org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.Long]: No default constructor found; nested exception is java.lang.NoSuchMethodException: java.lang.Long.<init>()
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:107)

完整的堆栈跟踪:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.Long]: No default constructor found; nested exception is java.lang.NoSuchMethodException: java.lang.Long.<init>()
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause

org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.Long]: No default constructor found; nested exception is java.lang.NoSuchMethodException: java.lang.Long.<init>()
    org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:107)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:775)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:368)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:172)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause

java.lang.NoSuchMethodException: java.lang.Long.<init>()
    java.lang.Class.getConstructor0(Class.java:3082)
    java.lang.Class.getDeclaredConstructor(Class.java:2178)
    org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:775)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:368)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:172)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

文件 Student.java

@Entity
@Table(name="Student")
public class Student implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="studentId")
    Long studentId;

    @Column(name="studentName")
    String studentName;

文件 Controller.java

    @RequestMapping(value = "/read.html")
    public String readStudent(Model model, @ModelAttribute("studentId") Long studentId) {
        Student student = null;
        studentId = 2l;
        try{
            student = serviceFile.readStudent(studentId);
        }catch(Exception e){
            model.addAttribute("message", "Some thing went wrong !!!! Exception occoured");
            return "message";
        }
        model.addAttribute("student", student);
        return "read";
    }

文件daoImpl.java

@Repository
@Transactional
public class DaoImplFile implements DaoFile {

    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }

    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    public Student read(Long studentId) throws NullPointerException {
        Student student = entityManager.find(Student.class, studentId);
        if (student!=null) {
            return student;
        } else {
            return null;
        }
    }

【问题讨论】:

  • 请发布整个堆栈跟踪
  • @Bunti 编辑了完整的堆栈跟踪
  • 你能试试把Long改成long吗?
  • @darshan mehta 我已经尝试过 long / Long,得到同样的错误

标签: java spring hibernate spring-mvc


【解决方案1】:

您应该将studentId 字段类型从Long 更改为long。它应该修复它。

另外一件让我眼前一亮的不相关的事情是:

if (student!=null) {
  return student;
} else {
  return null;
}

就是这么说的:

return student;

【讨论】:

  • 已经尝试过 long / Long,得到同样的错误
【解决方案2】:

@ModelAttribute("studentId") Long studentId 是问题的根源,因为 Spring 没有找到可以提供此 Long 对象的方法,因此它尝试实例化一个并将其作为方法参数传递。 要解决此问题,您可以:

  • 从方法参数中删除@ModelAttribue

     @RequestMapping(value = "/read.html")
     public String readStudent(Model model,Long studentId) {
         Student student = null;
         studentId = 2l;
         try {
             student = serviceFile.readStudent(studentId);
         } catch(Exception e){
             model.addAttribute("message", "Some thing went wrong !!!! Exception occured");
             return "message";
         }
         model.addAttribute("student", student);
         return "read";
     }
    
  • 创建一个提供Long 对象的方法 在你的控制器中

     @ModelAttribute
     public void provideStudentId(Model model){
         model.addAttribute("studentId", new Long(1));
     }
    

官方文档

@RequestMapping(path = "/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) { }

根据上面的例子,Pet 实例是从哪里来的?有几种选择:

  1. 由于使用了@SessionAttributes,它可能已经在模型中 — 见 名为“使用@SessionAttributes 存储模型属性”的部分 在请求之间的 HTTP 会话中”。
  2. 由于同一控制器中的 @ModelAttribute 方法,它可能已经在模型中 — 如上一节所述。
  3. 可以根据 URI 模板变量和类型转换器检索它(下面将详细说明)。
  4. 可以使用其默认构造函数对其进行实例化。

如果 studentId 是 UI 发送的参数名称,你可以像这样使用@RequestParam

@RequestMapping(value = "/read.html")
public String readStudent(Model model, @RequestParam("studentId") Long studentId) {
    Student student = null;
    studentId = 2l;
    try {
        student = serviceFile.readStudent(studentId);
    } catch(Exception e) {
        model.addAttribute("message", "Some thing went wrong !!!! Exception occoured");
        return "message";
    }
    model.addAttribute("student", student);
    return "read";
}

【讨论】:

  • @ac habahe 我想从 UI 动态获取这个 studentId,当控制进入控制器时 ("@ModelAttribute("studentId")Long studentId") 从 ui 获取 id 并处理实现
  • 嗨,Max,如果参数名称是 studentId,那么您可以使用 @RequestParam 我将编辑答案以向您展示如何
  • 即使我也有同样的问题,这对我有点帮助。我在 JSP 中有一个模态类。当我单击该按钮时,会打开一个包含复选框列表的表单。最初,当我单击按钮时出现此错误。正如你所说,我删除了@modalAttribute。现在,单击按钮时,控件直接转到控制器而不显示复选框。此外,其他模态对象也仅通过此请求映射。请帮忙
最近更新 更多