Use a struts interceptor instead of a servlet filter. That way you can check
the return type of the action that gets executed and respond appropriately.
Burton Rhodes wrote:
>
> I am having trouble getting Struts 2.x to implement validation and
> hibernate using the HibernateSessionRequestFilter (the pattern
> suggested on Hibernate.org). When the validation fails, Hibernate
> will still update the object in the database when the HibernateFilter
> closes the transaction. I get why this is happening, but I can't seem
> to find anyone who has really figured out an *elegant* solution. Any
> ideas?
>
>
>
> public class HibernateSessionRequestFilter implements Filter {
>
> static Logger log =
> Logger.getLogger(HibernateSessionRequestFilter.class);
>
> private SessionFactory sf;
>
> public void doFilter(ServletRequest request,
> ServletResponse response,
> FilterChain chain)
> throws IOException, ServletException {
>
> try {
>
> // This starts the Hibernate transaction
> sf.getCurrentSession().beginTransaction();
>
> // Call the next filter (continue request processing)
> chain.doFilter(request, response);
>
> // Commit and cleanup
> sf.getCurrentSession().getTransaction().commit(); <----
> ********* Data is written here no matter what ************
>
> } catch (StaleObjectStateException staleEx) {
> log.fatal("This interceptor does not implement optimistic
> concurrency control!");
> log.fatal("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
> of his work with
> // fresh data... what you do here depends on your
> applications design.
> throw staleEx;
>
> }
> // This is a catch-all catch, define other Exceptions here
> catch (Throwable ex) {
> // Rollback only
> ex.printStackTrace();
> try {
> if (sf.getCurrentSession().getTransaction().isActive()) {
> log.fatal("Trying to rollback database transaction
> after exception");
> sf.getCurrentSession().getTransaction().rollback();
> }
> } catch (Throwable rbEx) {
> log.fatal("Could not rollback transaction after exception!",
> rbEx);
> }
>
> // Let others handle it... maybe another interceptor for
> exceptions?
> throw new ServletException(ex);
> }
> }
>
> public void init(FilterConfig filterConfig) throws ServletException {
> log.trace("Initializing filter...");
> log.trace("Obtaining SessionFactory from static HibernateUtil
> singleton...");
> sf = HibernateUtil.getSessionFactory();
> }
>
> public void destroy() {}
>
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
--
View this message in context:
http://www.nabble.com/Using-validation-with-Hibernate...-tp20488996p20490241.html
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]