从数据库读取学生对象时出现此错误。
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)
学生.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; } }
这@ModelAttribute("studentId") Long studentId是问题的根源,因为spring找不到可以提供此Long对象的方法,因此它试图实例化一个对象并将其作为方法参数传递。 要解决此问题, 您可以:
@ModelAttribute("studentId") Long studentId
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实例可以从哪里来?有几种选择: 由于使用@SessionAttributes,它可能已经在模型中- 请参阅“使用@SessionAttributes在请求之间的HTTP会话中存储模型属性”一节。 由于同一控制器中的@ModelAttribute方法,它可能已经在模型中-如上一节中所述。 可以基于URI模板变量和类型转换器(在下面更详细地说明)来检索它。 可以使用其默认构造函数实例化它。
给定以上示例,Pet实例可以从哪里来?有几种选择:
编辑 如果studentId是参数的名字从你可以使用UI发送@RequestParam这样
@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"; }