JSONException:Spring、Struts 2、Hibernate 应用程序中的 org.hibernate.LazyInitializationException [英] JSONException: org.hibernate.LazyInitializationException in Spring, Struts 2, Hibernate application

查看:31
本文介绍了JSONException:Spring、Struts 2、Hibernate 应用程序中的 org.hibernate.LazyInitializationException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了上面的解释错误并做了一些研究,发现org.springframework.orm.hibernate4.support.OpenSessionInViewFilter 是解决方案.但它不适用于我的应用程序.

I'm getting above explain error and done some research and found that org.springframework.orm.hibernate4.support.OpenSessionInViewFilter is solution. But its not works with my application.

将数据加载到 jqGrid 时发生错误.

Error occurs during data load into jqGrid.

Struts2 动作类:

import com.ast.domain.admin.AtDivision;
import com.ast.domain.admin.AtOrganisation;
import com.ast.service.admin.OrganisationBo;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.ArrayList;
import java.util.List;

public class OraganisationAction extends ActionSupport implements ModelDriven<AtOrganisation> {

    private String sidx;
    // Search Field
    private String searchField;
    // The Search String
    private String searchString;
    // he Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
    private String searchOper;
    // Your Total Pages
    private Integer total = 0;
    //Your result List
    //private List<MyBean> gridModel;
    //get how many rows we want to have into the grid - rowNum attribute in the grid
    private Integer rows = 5;
    //Get the requested page. By default grid sets this to 1.
    private Integer page = 0;
    // sorting order - asc or desc
    private String sord;
    private boolean loadonce = false;
    private Integer records = 0;

    private AtOrganisation org = new AtOrganisation();
    private AtDivision div = new AtDivision();
    private List<AtOrganisation> gridModel = new ArrayList<AtOrganisation>();
    private List<AtOrganisation> temp_gridModel = new ArrayList<AtOrganisation>();

    private OrganisationBo orgBo;

    private String aoId;

    public List<AtOrganisation> getTemp_gridModel() {
        return temp_gridModel;
    }

    public void setTemp_gridModel(List<AtOrganisation> temp_gridModel) {
        this.temp_gridModel = temp_gridModel;
    }

    public Integer getRecords() {
        return records;
    }

  public void setRecords(Integer records) {
        this.records = records;
        if (this.records > 0 && this.rows > 0) {
            this.total = (int) Math.ceil((double) this.records / (double) this.rows);
        } else {
            this.total = 0;
        }
    }

    public String getSidx() {
        return sidx;
    }

    public void setSidx(String sidx) {
        this.sidx = sidx;
    }

    public String getSearchField() {
        return searchField;
    }

    public void setSearchField(String searchField) {
        this.searchField = searchField;
    }

    public String getSearchString() {
        return searchString;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }

    public String getSearchOper() {
        return searchOper;
    }

    public void setSearchOper(String searchOper) {
        this.searchOper = searchOper;
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }

    public Integer getRows() {
        return rows;
    }

    public void setRows(Integer rows) {
        this.rows = rows;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public String getSord() {
        return sord;
    }

    public void setSord(String sord) {
        this.sord = sord;
    }

    public boolean isLoadonce() {
        return loadonce;
    }

    public void setLoadonce(boolean loadonce) {
        this.loadonce = loadonce;
    }

    public List<AtOrganisation> getGridModel() {
        return gridModel;
    }

    public void setGridModel(List<AtOrganisation> gridModel) {
        this.gridModel = gridModel;
    }

    public String getAoId() {
        return aoId;
    }

    public void setAoId(String aoId) {
        this.aoId = aoId;
    }

    public void setOrgBo(OrganisationBo orgBo) {

        this.orgBo = orgBo;
    }

    public OrganisationBo getOrgBo() {
        return orgBo;
    }

    public AtDivision getDiv() {
        return div;
    }

    public void setDiv(AtDivision div) {
        this.div = div;
    }

    public AtOrganisation getOrg() {
        return org;
    }

    public void setOrg(AtOrganisation org) {

        this.org = org;
    }

    @Override
    public AtOrganisation getModel() {
        return org;
    }

    public String gridaction() {
        temp_gridModel = orgBo.showorg();
        System.out.println("setRecords : "+temp_gridModel.size());
        setRecords(temp_gridModel.size());
        int to = (getRows() * getPage());
        int from = to - getRows();

        if (to > getRecords()) {
            to = getRecords();
        }
        if (loadonce) {
            setGridModel(temp_gridModel);
        } else {
            if (searchString != null && searchOper != null && !searchString.equals("") && !searchOper.equals("")) {
                System.out.println("Searching within Database");
                if (searchOper.equalsIgnoreCase("cn")) {
                    // setGridModel(DAO.findbyName(searchString));
                }
            } else {
                System.out.println("Not Searching Anywhere");
                //setGridModel(DAO.find(from, to));
                System.out.println("dili 4444");
                setGridModel(temp_gridModel);
            }
        }
        System.out.println("getRecords() : "+(double) getRecords());
            System.out.println("(double) getRows() : "+(double) getRows());
        total = (int) Math.ceil((double) getRecords() / (double) getRows());
        System.out.println("tot " + total);
        System.out.println(gridModel.size());
        return "grid";
    }

    public String add() throws Exception {
        orgBo.addOrg(org);
        gridaction();
        return SUCCESS;

    }

    public String delete() throws Exception {

        orgBo.deleteOrg(org);
        gridaction();
        return SUCCESS;
    }

    public String edit() throws Exception {

        orgBo.updateOrg(org);
        gridaction();
        return SUCCESS;
    }



}

服务层获取组织方法:

  @Override
@Transactional(propagation = Propagation.REQUIRED)
public List showorg() {

    return orgDao.showorg();
}

DAO 方法:

  @Override
public List showorg() {

Session session = sessionfactory.getCurrentSession();

org.hibernate.Query query = session.createQuery("from AtOrganisation");

List list = query.list();

return list;

}

web.xml:

 <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/SpringConfiguration.xml</param-value>
    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
        <param-value>/WEB-INF/tiles.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
    </listener>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>Open Session in View Filter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Open Session in View Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

struts.xml:

<interceptors>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="params">
           
            <param name="acceptParamNames">
                (\[\d+\]\.)*\w+((\.\w+)|(\[\d+\])|(\(\d+\))|(\['\w+'\])|(\('\w+'\)))*
            </param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>
<action name="*orgs" class="com.ast.action.admin.OraganisationAction"
        method="{1}">
    <interceptor-ref name="defaultStack"/>

    <result name="grid" type="json"></result>   
</action>

错误堆栈:

  21:56:35,526 ERROR [org.apache.struts2.dispatcher.Dispatcher] (http-/127.0.0.1:8080-1) Exception occurred during processing request: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ast.domain.admin.AtOrganisation.atDivisions, could not initialize proxy - no Session: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ast.domain.admin.AtOrganisation.atDivisions, could not initialize proxy - no Session
    at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:246) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONWriter.processCustom(JSONWriter.java:178) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:168) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:134) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONWriter.write(JSONWriter.java:102) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:116) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONResult.createJSONString(JSONResult.java:202) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at org.apache.struts2.json.JSONResult.execute(JSONResult.java:176) [struts2-json-plugin-2.3.16.3.jar:2.3.16.3]
    at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371) [xwork-core-2.3.16.jar:2.3.16]
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275) [xwork-core-2.3.16.jar:2.3.16]
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) [xwork-core-2.3.16.jar:2.3.16]
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) [xwork-core-2.3.16.jar:2.3.16]
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) [xwork-core-2.3.16.jar:2.3.16]
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) [struts2-core-2.3.16.jar:2.3.16]
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562) [struts2-core-2.3.16.jar:2.3.16]
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) [struts2-core-2.3.16.jar:2.3.16]
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) [struts2-core-2.3.16.jar:2.3.16]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
    at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_40]
Caused by: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ast.domain.admin.AtOrganisation.atDivisions, could not initialize proxy - no Session

请提供一些方法来解决这个问题.

Please give some way to overcome this issue.

推荐答案

您应该只将那些您想在网格中显示的属性序列化为 JSON.它可以通过不同的方式实现:

You should serialize to JSON only those properties that you want to show in the grid. It could be achieved by different ways:

1) 将要使用参数序列化的属性限制为 json 结果

1) Limit properties you want to serialize using parameters to json result

@Result(type = "json", params = {
       "includeProperties", "gridModel\[\d+\]\.id, gridModel\[\d+\]\.name, total, records, rows, page, sidx, searchField, searchString", 
   "excludeNullProperties", "true"
})

2) 通过 json 注解排除属性.

2) Exclude properties via json annotation.

@JSON(serialize = false, deserialize = false) // this prevents from output name field values

如果您使用了 Open Session In View 过滤器,那么它可以加载这些属性并按需初始化它们,即在序列化期间.因为当您的操作返回 JSON 结果时,休眠会话仍然保持打开状态.当返回结果时,Struts2 执行它.此时会话应该是打开的.为此,您应该配置过滤器链的顺序.如果 Open Session In View 过滤器位于第一顺序,则可以在 Struts2 结果执行后关闭会话.

If you have used Open Session In View filter, then it can load those properties and initialize them on demand, i.e. during serialization. Because the hibernate session still remains open when your action returns JSON result. When result is returned Struts2 executes it. At this moment the session should be open. To make this possible you should configure the order of the filter chain. If Open Session In View filter is in the first order then is possible to close the session after Struts2 result is executed.

<filter>
    <filter-name>Open Session in View Filter</filter-name>
    <filter-class>
        org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>Open Session in View Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>   

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这篇关于JSONException:Spring、Struts 2、Hibernate 应用程序中的 org.hibernate.LazyInitializationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆