/*
* HibernateOpenSessionInViewInterceptor.java
*
* Created on March 18, 2006, 3:51 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package edu.washington.javawebdevelopment.webwork.interceptor;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.AroundInterceptor;
import edu.washington.javawebdevelopment.dao.DaoFactoryHibernate;
import javax.servlet.ServletException;
import org.hibernate.SessionFactory;
import org.hibernate.StaleObjectStateException;
/**
*
* @author gary
*/
public class HibernateOpenSessionInViewInterceptor extends AroundInterceptor {
private SessionFactory hibernateSessionFactory;
public void init() {
System.out.println("Initializing HibernateOpenSessionInViewInterceptor
interceptor, obtaining Hibernate SessionFactory from DaoFactoryHibernate");
hibernateSessionFactory = DaoFactoryHibernate.getSessionFactory();
}
public void destroy() {
}
public void before(ActionInvocation invocation) throws Exception {
System.out.println("Starting a database transaction in the
HibernateOpenSessionInViewInterceptor");
hibernateSessionFactory.getCurrentSession().beginTransaction();
}
public void after(ActionInvocation invocation, String result) throws
Exception {
// Commit and cleanup
try {
System.out.println("Committing the database transaction in the
HibernateOpenSessionInViewInterceptor");
hibernateSessionFactory.getCurrentSession().getTransaction().commit();
} catch (StaleObjectStateException staleEx) {
System.err.println("This interceptor does not implement optimistic
concurrency control!");
System.err.println("Your application will not work until you add
compensation actions!");
// Rollback, close everything, possibly compensate for any
permanent changes
// during the conversation, and finally restart business
conversation. Maybe
// give the user of the application a chance to merge some if his
work with
// fresh data... what you do here depends on your applications
design.
throw staleEx;
} catch (Throwable ex) {
// Rollback only
ex.printStackTrace();
try {
if
(hibernateSessionFactory.getCurrentSession().getTransaction().isActive()) {
System.out.println("Trying to rollback database
transaction after exception");
hibernateSessionFactory.getCurrentSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
System.err.println("Could not rollback transaction after
exception! - " + rbEx);
}
// Let others handle it... maybe another interceptor for
exceptions?
throw new ServletException(ex);
}
}
}
?
Martin-
> Date: Tue, 11 Feb 2014 14:42:47 -0700
> Subject: Re: REST question
> From: [email protected]
> To: [email protected]
>
> Sounds like you have used the Open Session in View method... probably
> provided by a custom interceptor, when adding the rest plugin you have
> changed your action to the rest package and forgot to put your interceptor
> back in place, so now you don't have a hibernate session and the view
> generates this error.
>
>
> On Mon, Feb 10, 2014 at 10:40 PM, Miguel <[email protected]> wrote:
>
> > Hi,
> >
> > A strange situation happens when I load *struts2-rest-plugin-2.3.16.jar*
> > With out the REST plugin my action and jsp's works as always has worked.
> > But with the mere inclusion of the REST Plugin, some jsp's stops finding
> > variables, because the variable name changes.
> > Here is the snippet:
> >
> > struts.xml
> >
> > <constant name="struts.objectFactory"
> > value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
> > <constant name="struts.objectFactory.spring.autoWire" value="name" />
> > <package name="proyectox" extends="json-default" >
> > <!-- Si no le pones este stack, pues no funciona...-->
> > <interceptors>
> > <interceptor name="strutsSpring"
> >
> > class="com.proyectox.ui.interceptor.HibernateOpenSessionInViewInterceptor"/>
> > <interceptor name="viewuseragentselector"
> > class="com.proyectox.ui.interceptor.UserAgentResultInterceptor"/>
> > <interceptor-stack name="strutsSpringPPPStack">
> > <interceptor-ref name="strutsSpring"/>
> > <interceptor-ref name="paramsPrepareParamsStack"/>
> > <interceptor-ref name="viewuseragentselector"/>
> > </interceptor-stack>
> > </interceptors>
> > ...
> > </package>
> >
> > <package name="cfdi" extends="proyectox" namespace="/cfdi">
> > <action name="header_*" class="com.fcm.cfdi.ui.HeaderAction">
> > <result type="redirectAction">
> > <param name="actionName">edit</param>
> > </result>
> > <!-- <result >printHeader.jsp</result>-->
> > <result name="input">headerEdit.jsp</result>
> > <result name="error">/facturaerror.jsp</result>
> > <interceptor-ref name="scope">
> > <param name="session">contribuyente</param>
> > <param name="autoCreateSession">true</param>
> > <param name="key">contribuyenteActual</param>
> > </interceptor-ref>
> > <interceptor-ref name="scope">
> > <param name="session">factura</param>
> > <param name="autoCreateSession">false</param>
> > <param name="key">cfdi</param>
> > </interceptor-ref>
> > <interceptor-ref name="strutsSpringPPPStack"/>
> > </action>
> >
> >
> >
> > HeaderAction.java:
> >
> > public class HeaderAction extends ActionSupport implements Preparable {
> > protected Contribuyente contribuyente;
> > protected Long contribuyenteId;
> >
> > public void prepare() throws Exception {
> > ...
> > }
> >
> >
> > public String input(){
> >
> > dirReceptorId = factura.getDomicilioReceptor().getId();
> > dirEmisionId = factura.getDomicilioEmision().getId();
> > return INPUT;
> > }
> > ...
> > public Contribuyente getContribuyente() {
> > return contribuyente;
> > }
> >
> > public void setContribuyente(Contribuyente contribuyente) {
> > this.contribuyente = contribuyente;
> > }
> > ...
> > }
> >
> > edit.jsp:
> > ...
> > <s:select label="Direccion Emision"
> > name="dirEmisionId"
> > list="*contribuyente*.domicilios"
> > listKey="id"
> > listValue="nombre"
> > multiple="false"
> > size="1"
> > required="true"
> > key="factura.direccionEmision.id"
> > />
> > ...
> >
> > After loading *struts2-rest-plugin-2.3.16.jar* it starts giving the
> > following exception:
> > Caused by: org.hibernate.LazyInitializationException: failed to lazily
> > initialize a collection of role: *contribuyentes.domicilios*, no session or
> > session was closed
> > ...
> >
> > I know that's a Hibernate exception, but the jsp works fine without the
> > REST Plugin.
> > It's like the REST Plugin appends that extra "s" after the variable name in
> > the .jsp or the value stack changes or something like that.
> >
> > The action is invoked without error in either case, and has into it's
> > fields the required values.
> >
> >
> > Does anyone has any pointer of what can be happening?
> >
> > Thanks
> >
> > Si quieres ser más positivo, pierde un electrón
> > Miguel Ruiz Velasco Sobrino
> >