【问题标题】:Exception in JSP when populating a table with list使用列表填充表时 JSP 中的异常
【发布时间】:2016-03-25 06:05:44
【问题描述】:

我有这个jsp代码。

<c:forEach var="item" items="${UsersList}">
 <tr>
 <td><c:out value="${item.userId}" /></td>
 <td><c:out value="${item.userName}" /></td>
 <td><c:out value="${item.car}" /></td>  //Here , I am getting exception
 </tr>
 </c:forEach>

UserList 由数据类型为“Car”的名为“car”的属性组成

用户的 Pojo Class 类:

@Entity
@Table(name = "Users")
public class Users implements java.io.Serializable {

private int userId;
private Car car;
private Groups groupId;
private UserType userType;
private String userName;

//getters and setters
}

我正在使用 Spring MVC 框架。在页面加载时,我的应用程序应该显示一个包含用户列表的表格。在控制器中,我正在查询用户列表,并将其添加到 ModelAndView 对象中

控制器代码:

List<Users> userList = service.getUserList();  //this will get list of users
//System.out.println("Userlist ==" +userList.size()); 
mv.addObject("UsersList" , usersList);
//skipped remaining code

当我尝试不带汽车(tabledata 标记)时,JSP 无一例外地运行并在表中显示用户列表。如果我尝试添加汽车(tabledata 标记),则会出现异常

HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/pages/CreateUser.jsp at line 199 
org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/pages/CreateUser.jsp at line 199

196:<tr>
197:<td><c:outvalue="${item.userId}" /></td>
198:<td><c:out value="${item.userName}" /></td>
199:<!-- <td><c:out value="${item.car}" /></td> --> 
200:<td><c:out value="${item.modifiedDate}" /></td>
201:</tr>
202:</c:forEach>                                            


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWra    pper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:4    70)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutput    Model(InternalResourceView.java:168)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:3    03)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.j    ava:1244)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(Disp    atcherServlet.java:1027)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServl    et.java:971)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServle    t.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkSer    vlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java    :861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.ja    va:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
root cause

org.hibernate.LazyInitializationException: could not initialize proxy - no  Session
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:149)
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
com.bdp.pojo.Role_$$_javassist_11.toString(Role_$$_javassist_11.java)
org.apache.taglibs.standard.tag.common.core.OutSupport.out(OutSupport.java:178)
org.apache.taglibs.standard.tag.common.core.OutSupport.doStartTag(OutSupport.java:99)
org.apache.jsp.WEB_002dINF.pages.CreateUser_jsp._jspx_meth_c_005fout_005f2(CreateUser_jsp.java:667)
org.apache.jsp.WEB_002dINF.pages.CreateUser_jsp._jspx_meth_c_005fforEach_005f0(CreateUser_jsp.java:591)
org.apache.jsp.WEB_002dINF.pages.CreateUser_jsp._jspService(CreateUser_jsp.java:264)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
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:1244)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
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:621)
org.springframeweb.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

【问题讨论】:

    标签: java spring jsp spring-mvc pojo


    【解决方案1】:

    由于您使用的是休眠延迟初始化,因此每当您将主对象返回给 JSP 时,它都会尝试获取子类。这不会发生,因为会话将被关闭。

    因此将您的获取策略更改为Eager

    关于你的汽车的吸气剂方法:

    @OneToOne(fetch=FetchType.EAGER)
    

    这将导致在您获取主类时立即获取car

    在查询中进行:

     List<Users> items = session.createCriteria(Users.class)
                        .setFetchMode("car", FetchMode.JOIN).
                        .createAlias("car", "car").
                        .list();
    

    【讨论】:

    • 我试过这样做。但是,它反映了整个项目。我得到了例外。
    • “例外”是什么意思。您可以在查询执行期间更改获取策略
    • 哦!我不知道那个。您能对此提供任何好的参考吗?
    【解决方案2】:

    您收到错误LazyInitializationExceptionUsers 惰性 Car 对象中的对象。 service.getuserlist(); 方法可以通过 fetch 引入Car 对象。

    获取策略

    FetchType.LAZY 按需提供

    FetchType.EAGER 是即时的

    @OneToOne(fetch=FetchType.EAGER) 当你确实想把用户对象作为汽车的对象时。

    service.getUserList ()请写信。

    编辑:

    例如getUserList方法:

    public List<Users> getUserList(){
        String sql = " SELECT user from Users user left join fetch user.car ";
        Query query = entityManager.createQuery(sql);
        return query.getResultList();
    }
    

    【讨论】:

    • 我尝试了您的查询,但没有得到实际值。我得到了这样的对象com.project.pojo.Car@74b02890
    • 这个 com.project.pojo.Car@74b02890 代理对象。见stackoverflow.com/a/25340780/1638718
    • 没有错误兄弟 :) 但不显示值.. 显示该对象
    • 请填写汽车对象。
    • 汽车Pojo类写。
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多