I figured out how to do this - posting here so others will benefit. 1. Create a new ConditionalVisitorFieldValidator.java:
public class ConditionalVisitorFieldValidator extends VisitorFieldValidator { private String expression; public void setExpression(String expression) { this.expression = expression; } public String getExpression() { return expression; } /** * If expression evaluates to true, invoke visitor validation. * @param object the object being validated * @throws ValidationException */ public void validate(Object object) throws ValidationException { if (validateExpression(object)) { super.validate(object); } } /** * Validate the expression contained in the "expression" paramter. * @param object the object you're validating * @return true if expression evaluates to true (implying a validation failure) * @throws ValidationException if anything goes wrong */ public boolean validateExpression(Object object) throws ValidationException { Boolean answer = Boolean.FALSE; Object obj = null; try { obj = getFieldValue(expression, object); } catch (ValidationException e) { throw e; } catch (Exception e) { // let this pass, but it will be logged right below } if ((obj != null) && (obj instanceof Boolean)) { answer = (Boolean) obj; } else { log.warn("Got result of " + obj + " when trying to get Boolean."); } return answer; } } 2. Add it to your validators.xml: <validator name="conditionalvisitor" class="com...validation.ConditionalVisitorFieldValidator"/> 3. Write your validation rule: <field name="colleaguePosition"> <field-validator type="fieldexpression" short-circuit="true"> reason == 'colleague' and colleaguePositionID == '_CHOOSE_' <message>You must choose a position where you worked with this person, or choose "Other..."</message> </field-validator> <field-validator type="conditionalvisitor"> reason == 'colleague' and colleaguePositionID == 'OTHER' <message/> </field-validator> </field> Hope this helps, Matt mraible wrote: > > I need to do something similar - is it possible to have conditional > visitor validation in Struts 2? AFAICT, it isn't. > > Basically, I'd like to have a couple of validation rules for a drop-down. > One rule is that the user must select at least one choice when the > drop-down has its radio button selected: > > <field-validator type="fieldexpression" short-circuit="true"> > reason != 'partner' or (reason == 'partner' and partnerPositionID > != '_CHOOSE_') > <message>You must choose a position where you worked with this > person, or choose "Other..."</message> > </field-validator> > > This works. Now I want to require a number of fields if the person selects > the "Other..." option. The validation syntax starts to get complicated at > this point. I'd like to do something like: > > reason != 'partner' or (reason == 'partner' and partnerPositionID != > 'OTHER') -> kick in visitor validation. > > I still think the above syntax is confusing (ref > http://tinyurl.com/2htw2k), I'd much rather write something like: > > reason == 'partner' and partnerPositionID == 'OTHER' -> show message > > I'm guessing it's possible to write my own FieldExpressionValidator that > inverses the true/false outcome? > > Why do I need conditional visitor validation? > > I'm trying to create a "component" that can be re-used in the backend > (model object w/ its own validation rules) and on the front-end (using JSP > tag files or the s:component tag). > > If there's an easier way to do this, please let me know. Of course, I > could use JSF/Wicket/Tapestry - and that might be the outcome if this is > not possible. > > Thanks, > > Matt > > > Sparecreative wrote: >> >> Is there a way to setup conditional validation through the validation.xml >> file? >> >> I'm currently user the visitor validator method where my core user >> validation properties are in a User-validation.xml file. I want to be >> able >> to use this same file for all my user actions (register, add, update) and >> just have conditional code which looks a user field to determine >> validation. >> >> At the moment I'm using a combination of the valididation.xml file and >> the >> validate method in the action. >> >> I know the following doesn't work, but can I have something like this: >> >> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator >> 1.0.2//EN" >> "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> >> <validators> >> >> <validator type="expression"> >> >> user.action.equals('insert') || user.action.equals('register') >> <!-- only validate these fileds when inserting and registering a user >> --> >> <field name="user.password"> >> <field-validator type="requiredstring"> >> <message key="user.password.empty"/> >> </field-validator> >> </field> >> <field name="user.confirmPassword"> >> <field-validator type="requiredstring"> >> <message key="user.confirmPassword.empty"/> >> </field-validator> >> </field> >> </validator> >> <!-- core validated fields --> >> <field name="user.name"> >> <field-validator type="requiredstring"> >> <message key="user.name.empty"> >> resource not found</message> >> </field-validator> >> </field> >> <field name="user.email"> >> <field-validator type="requiredstring" >> short-circuit="true"> >> <message key="user.email.empty"/> >> </field-validator> >> <field-validator type="email"> >> <message key="user.email.invalid"/> >> </field-validator> >> </field> >> <field name="user.phone"> >> <field-validator type="stringlength"> >> 10 >> <message key="user.phone.length"/> >> </field-validator> >> </field> >> <field name="user.city"> >> <field-validator type="requiredstring"> >> <message key="user.city.empty"/> >> </field-validator> >> </field> >> >> >> >> Z. >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> >> > > -- View this message in context: http://www.nabble.com/Conditional-validation-tf3678771.html#a11990883 Sent from the Struts - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]