i tried solution 4 where the action:
- has the DTO itself as an instance variable (as opposed to having DTO
fields as instance variables)
- implements ParameterNameAware

it works ok with regard to parameter interception but the parameters are not
checked by validation annotations. this is because these parameters are set
in the DTO itself not in the action. so I have just implemented solution 4
as you suggested i.e. having parameters in the form corresponding to action
variables:

- the prepare() method gets the DTO and sets it in a private instance
variable (no DTO getter/setter)
- the save() method updates the private DTO with the read-writable
parameters set in the action

this way, the DTO is set with corresponding action variables which are
guaranteed to be:
- read-writeable: they belong to the white list of allowed parameters used
by acceptableParameterName() (interface ParameterNameAware)
- valid: they are checked by validation annotations

however, with this set up (parameters as instance variables instead of DTO
as instance variable) the acceptableParameterName() is no longer needed,
because the only setters available in the action are the ones corresponding
to read-writeable parameters.

i will leave actions implementing ParameterNameAware anyway. it's an extra
protection which may be helpful in cases where additional setters (either in
the action or in action subclasses) are added and one wants explicit control
over allowed parameters.

thanks again,
santos.

On Mon, Mar 23, 2009 at 2:12 PM, Nils-Helge Garli Hegvik
<[email protected]>wrote:

> The documentation for the ParametersInterceptor [1] mentions the
> ParameterNameAware interface [2]. Maybe that could be a solution?
>
> Nils-H
>
> [1] - http://struts.apache.org/2.1.6/docs/parameters-interceptor.html
> [2] -
> http://struts.apache.org/2.1.6/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ParameterNameAware.html
>
> On Mon, Mar 23, 2009 at 1:53 PM, José Santos <[email protected]>
> wrote:
> > hi,
> >
> > what's the recommended design for avoiding fields of DTOs in the value
> stack
> > being updated through (HTML) DOM manipulation?
> >
> > consider a typical edit page containing a form with some fields. this
> page
> > is a visual representation of a DTO we are about to update. the DTO is
> set
> > in the action - it was fetched from the database during prepare() - and
> > therefore is accessible from the value stack (the JSP generating the edit
> > page populated the form fields with corresponding DTO fields using OGNL).
> >
> > by manipulating the DOM of the edit page (e.g. using Firebug) one can add
> a
> > new input field to the form. this input field may correspond to a DTO
> > read-only instance variable we would like the action *not* to update.
> upon
> > form submission, the DTO is updated with all the form fields (existing
> ones
> > + the one added to the DOM) and persisted in the database.
> >
> > there are several possible solutions to this issue:
> >
> > solution 1: validate the DTO before persisting it in the database. the
> DTO
> > would be persisted only if no "read-only" fields were updated. this could
> be
> > achieved e.g. through a comparison between the updated DTO and a clone of
> > the original DTO (fetched during prepare()).
> >
> > solution 2: another way to solve this would be to apply authorisation
> rules
> > in the model and therefore guarantee that certain DTO setters are
> > "read-only".
> >
> > solution 3: use a DTO proxy object instead of the DTO itself. the DTO
> proxy
> > object would contain the DTO read-write fields only. the DTO would then
> be
> > updated with the corresponding DTO proxy fields before being persisted in
> > the database.
> >
> > solution 4: not to use the "model-driven" approach and have setters in
> the
> > action corresponding to DTO read-write fields. the DTO would then be
> updated
> > with the corresponding action fields before being persisted in the
> database.
> >
> > i am not considering a solution where setters of "read-only" fields are
> > removed from the DTO class as this would invalidate the update of those
> > fields by anyone (which includes users with higher privileges).
> >
> > i would like to hear about your design solutions to this issue.
> >
> > thanks in advance,
> > santos.
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to