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]