Hi Matt,
Can you please tell me what's needed to use this validator using annotations
alone? . Also, i need a simple conditional validator - ie a field needs to
be validated only if a prerequisite condition is satisfied, else the
validations on it must be skipped and no error must be added (since this is
just a condition check).
Example : if appname is to be validated only if appid < 100, i will give the
inverse expression in ConditionalFieldValidator with shortCircuit true and
the subsequent validations below it ; assumption being if the first
condition becomes true (i.e prerequisite not satisfied), then dont validate
further.
The annotation i need would look like :
@ConditionalFieldValidator(fieldName = "app.appname", expression =
"app.appid > 100", message = "", shortCircuit=true)
@StringLengthFieldValidator(fieldName = "app.appname" message = "App Name
must be gt 5 chars", minLength = "5", maxLength = "12")
I don't know how to make Struts 2 "see" this custom validator.
Thanks,
Joseph
mraible wrote:
>
> 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#a12131518
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]