I haven't tried working with Struts 2's annotations for validation yet, so I'm unable to answer this question. In a week, things might be different. ;-)
Matt strutstwouser wrote: > > 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#a12131596 Sent from the Struts - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]