ServletActionRedirectResult worked when I used it instead of the
ActionChainResult. This performs an extra round trip back to the
browser, which isn't terrible unless I want to pass data from one Action
to another, and herein lies some concern.

Here's my design, and if you guys think it's flawed I'm certainly
willing to take criticism!

GETs are simple: just an Action that does some work and forwards to the
view.

POSTS should each have their own Action (which may write the data to the
DB). This Action should only process the POST. Afterwards, it forwards
(chains) to another Action, which sits in front of the view. If the view
needs data from the DB, it goes in the Action for that view (not the
POST-handling Action). If the view doesn't need data, then the Action is
dumb and just forwards to the view.

No direct links are made to JSPs, instead they link to the associated
Action. We can make exceptions for very simple views that are tied to
the POST (like a confirmation page), maybe it wouldn't need two Actions.

The advantage of this is two-fold:
a) if we ever need to make a 'dumb' action do DB lookups, we don't have
to change any links, just the dumb Action
b) we can reuse any JSP easily since all DB operations for it are
performed by its associated Action

Seems like a nice design, but Action chaining isn't recommended, and
isn't working with CGLIB proxies  :-(

p.s. the codebehind plugin makes it so we don't have to write those dumb
actions. Nice!!

Brad Cupit
Louisiana State University - UIS

-----Original Message-----
From: Brad A Cupit 
Sent: Monday, April 07, 2008 11:10 AM
To: 'user@struts.apache.org'
Subject: interesting proxy + action chain issue

Hi! I'm having a very interesting issue with CGLIB proxies. I'm proxying
my actions with Spring AOP (to get declarative transactions on each
Action).

Everything is working great, except when I try action chaining, I get a
class cast exception that Action2 can't be cast to Action1 (Action1 is
first in the chain).

This was very unusual, so I investigated. Here's what I found:

OgnlUtil.copy() is calling all of the getters in Action1 and pumping
that data into setters on Action2. With CGLIB, it calls getCallbacks()
and setCallbacks(), two methods created by CGLIB. This results in
Action2 having Action1's callbacks. Basically, it's similar to the
Action2 proxy referencing the Action1 target!

I can't use JDK proxies because the getters on my action (whose values
will be part of the value stack) are not defined on any interfaces, so
reflection on a JDK proxy will not find those getters.

I have a few ideas for workarounds, but I'd like to ask: has anyone else
seen this? Am I the first to try CGLIB proxies and Action chaining?

I've also read that action chaining is discouraged, but I don't
understand why. Maybe a completely different approach would work better?

Thanks!

Brad Cupit
Louisiana State University - UIS


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to