2017-10-15 50 views
1

我使用hibenate和spring mvc编写了一个程序。但是当我执行编辑函数时,它会抛出错误。javax.el.E​​LException:在类型Person上读取[name]错误

Type Exception Report 

Message An exception occurred processing JSP page [/WEB-INF/views/person.jsp] at line [24] 

Description The server encountered an unexpected condition that prevented it from fulfilling the request. 

Exception 

org.apache.jasper.JasperException: An exception occurred processing JSP page [/WEB-INF/views/person.jsp] at line [24] 

21: 
22: <form:form action="${addAction}" commandName="person"> 
23:  <table> 
24:   <c:if test="${!empty person.name}"> 
25:    <tr> 
26:     <td> 
27:      <form:label path="id"> 


Stacktrace: 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168) 
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) 
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257) 
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

Root Cause 

javax.el.ELException: Error reading [name] on type [com.baotrung.entity.Person_$$_jvsta7c_0] 
    javax.el.BeanELResolver.getValue(BeanELResolver.java:98) 
    org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110) 
    org.apache.el.parser.AstValue.getValue(AstValue.java:169) 
    org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46) 
    org.apache.el.parser.AstNot.getValue(AstNot.java:43) 
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184) 
    org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:944) 
    org.apache.jsp.WEB_002dINF.views.person_jsp._jspx_meth_c_005fif_005f0(person_jsp.java:325) 
    org.apache.jsp.WEB_002dINF.views.person_jsp._jspx_meth_form_005fform_005f0(person_jsp.java:247) 
    org.apache.jsp.WEB_002dINF.views.person_jsp._jspService(person_jsp.java:170) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168) 
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) 
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257) 
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

Root Cause 

org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
    org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:147) 
    org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:260) 
    org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) 
    com.baotrung.entity.Person_$$_jvsta7c_0.getName(Person_$$_jvsta7c_0.java) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    javax.el.BeanELResolver.getValue(BeanELResolver.java:94) 
    org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110) 
    org.apache.el.parser.AstValue.getValue(AstValue.java:169) 
    org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46) 
    org.apache.el.parser.AstNot.getValue(AstNot.java:43) 
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184) 
    org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:944) 
    org.apache.jsp.WEB_002dINF.views.person_jsp._jspx_meth_c_005fif_005f0(person_jsp.java:325) 
    org.apache.jsp.WEB_002dINF.views.person_jsp._jspx_meth_form_005fform_005f0(person_jsp.java:247) 
    org.apache.jsp.WEB_002dINF.views.person_jsp._jspService(person_jsp.java:170) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168) 
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) 
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257) 
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

PersonEntity

package com.baotrung.entity; 

import javax.persistence.*; 

@Entity 
@Table(name = "PERSON") 
public class Person { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    private String name; 
    private String country; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + 
       "id=" + id + 
       ", name='" + name + '\'' + 
       ", country='" + country + '\'' + 
       '}'; 
    } 
} 

控制器类

package com.baotrung.controller; 

import com.baotrung.entity.Person; 
import com.baotrung.services.PersonService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
public class PersonController { 

    private PersonService personService; 

    @Autowired(required = true) 

    public void setPersonService(PersonService personService) { 
     this.personService = personService; 
    } 

    @RequestMapping(value ="/persons",method = RequestMethod.GET) 
    public String listPersons(Model model){ 
     model.addAttribute("person",new Person()); 
     model.addAttribute("listPersons",this.personService.listPerson()); 
     return "person"; 
    } 

    @RequestMapping(value ="/person/add",method = RequestMethod.POST) 
    public String addPerson(@ModelAttribute("person")Person p){ 
     if(p.getId()==0){ 
      this.personService.addPerson(p); 
     }else{ 
      this.personService.updatePerson(p); 
     } 
     return "redirect:/persons"; 
    } 
    @RequestMapping("/edit/{id}") 
    public String editPerson(@PathVariable("id")int id,Model model){ 
     model.addAttribute("person",this.personService.getPersonById(id)); 
     model.addAttribute("listPersons",this.personService.listPerson()); 
     return "person"; 
    } 
    @RequestMapping("/remove/{id}") 
    public String removePerson(@PathVariable("id")int id){ 
     this.personService.removePerson(id); 
     return "redirect:/persons"; 
    } 

} 

人DAO

package com.baotrung.dao; 

import com.baotrung.entity.Person; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 


import java.util.List; 



public class PersonDAOImpl implements PersonDAO { 
    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    @Override 
    public void addPerson(Person p) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     session.persist(p); 

    } 

    @Override 
    public void updatePerson(Person p) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     session.update(p); 

    } 
    @SuppressWarnings("unchecked") 
    @Override 
    public List<Person> listPerson() { 
     Session session = this.sessionFactory.getCurrentSession(); 
     List<Person> personList = session.createQuery("from Person").list(); 
     return personList; 
    } 

    @Override 
    public Person getPersonById(int id) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     Person p = (Person) session.load(Person.class,new Integer(id)); 
     return p; 
    } 

    @Override 
    public void removePerson(int id) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     Person p = (Person)session.load(Person.class,new Integer(id)); 
     if(null!=p){ 
      session.delete(p); 
     } 
    } 
} 

人服务

package com.baotrung.services; 

import com.baotrung.dao.PersonDAO; 
import com.baotrung.entity.Person; 
import org.springframework.transaction.annotation.Transactional; 


import java.util.List; 

public class PersonServiceImpl implements PersonService { 
    private PersonDAO personDAO; 

    public void setPersonDAO(PersonDAO personDAO) { 
     this.personDAO = personDAO; 
    } 

    @Override 
    @Transactional 
    public void addPerson(Person p) { 
     this.personDAO.addPerson(p); 
    } 


    @Override 
    @Transactional 
    public void updatePerson(Person p) { 
     this.personDAO.updatePerson(p); 
    } 

    @Override 
    @Transactional 
    public List<Person> listPerson() { 
     return this.personDAO.listPerson(); 
    } 

    @Override 
    @Transactional 
    public Person getPersonById(int id) { 
     return this.personDAO.getPersonById(id); 
    } 

    @Override 
    @Transactional 
    public void removePerson(int id) { 
     this.personDAO.removePerson(id); 
    } 
} 

Jsp页面:Person.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<%@ page session="false" %> 
<html> 
<head> 
    <title>Person Page</title> 
    <style type="text/css"> 
     .tg {border-collapse:collapse;border-spacing:0;border-color:#ccc;} 
     .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#fff;} 
     .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#f0f0f0;} 
     .tg .tg-4eph{background-color:#f9f9f9} 
    </style> 
</head> 
<body> 
<h1> 
    Add a Person 
</h1> 
<c:url var="addAction" value="/person/add" ></c:url> 

<form:form action="${addAction}" commandName="person"> 
    <table> 
     <c:if test="${!empty person.name}"> 
      <tr> 
       <td> 
        <form:label path="id"> 
         <spring:message text="ID"/> 
        </form:label> 
       </td> 
       <td> 
        <form:input path="id" readonly="true" size="8" disabled="true" /> 
        <form:hidden path="id" /> 
       </td> 
      </tr> 
     </c:if> 
     <tr> 
      <td> 
       <form:label path="name"> 
        <spring:message text="Name"/> 
       </form:label> 
      </td> 
      <td> 
       <form:input path="name" /> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <form:label path="country"> 
        <spring:message text="Country"/> 
       </form:label> 
      </td> 
      <td> 
       <form:input path="country" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <c:if test="${!empty person.name}"> 
        <input type="submit" 
          value="<spring:message text="Edit Person"/>" /> 
       </c:if> 
       <c:if test="${empty person.name}"> 
        <input type="submit" 
          value="<spring:message text="Add Person"/>" /> 
       </c:if> 
      </td> 
     </tr> 
    </table> 
</form:form> 
<br> 
<h3>Persons List</h3> 
<c:if test="${!empty listPersons}"> 
    <table class="tg"> 
     <tr> 
      <th width="80">Person ID</th> 
      <th width="120">Person Name</th> 
      <th width="120">Person Country</th> 
      <th width="60">Edit</th> 
      <th width="60">Delete</th> 
     </tr> 
     <c:forEach items="${listPersons}" var="person"> 
      <tr> 
       <td>${person.id}</td> 
       <td>${person.name}</td> 
       <td>${person.country}</td> 
       <td><a href="<c:url value='/edit/${person.id}' />" >Edit</a></td> 
       <td><a href="<c:url value='/remove/${person.id}' />" >Delete</a></td> 
      </tr> 
     </c:forEach> 
    </table> 
</c:if> 
</body> 
</html> 

我不明白为什么春天找不到财产person.name。我已经在人身上设置了二传手和获得者。请帮帮我。谢谢

回答

0

发生不是例外您Person类(看起来不错BTW),但在你的类创建Hibernateproxy对象,注意到奇怪的类名Person_$$_jvsta7c_0

这是因为当你调用edit动作,方法getPersonById被称为这就要求

Person p = (Person) session.load(Person.class,new Integer(id)); 

session.load()创建了未初始化其值的proxy对象。

一些信息关于session.load()session.get()source

session.load()

  • 它总是会返回一个“代理”(休眠期)而无需访问数据库。在Hibernate中,proxy是一个具有 给定标识符的对象,其属性尚未初始化,它只是看起来像一个 临时假对象。
  • 如果找不到任何行,则会抛出ObjectNotFoundException。

session.get()

  • 它总是击中了数据库,并返回真正的对象,代表了数据库行,而不是代理的对象。
  • 如果未找到任何行,则返回null。

总之尝试改变session.load()session.get()

+1

非常感谢你。它适合我。你太棒了。 –

相关问题