Just to follow up, I've created my own custom FieldExpressionValidator to get
my desired behavior. The code is below in case anyone wants to use it.
Here's how:

1. Create a validators.xml in your WEB-INF/classes (or src/main/resources
for M2) to override the "fieldexpression" validator:

<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd";>

<validators>
  <validator name="fieldexpression"
class="com.yourcompany.app.validation.LogicalFieldExpressionValidator"/>
</validators>

2. Create LogicalFieldExpressionValidator:

package com.yourcompany.app.validation;

import
com.opensymphony.xwork2.validator.validators.FieldExpressionValidator;
import com.opensymphony.xwork2.validator.ValidationException;

/**
 * Override XWork's FieldExpressionValidator because it's more intuitive to
 * write expressions that evaluate to false rather than true.
 */
public class LogicalFieldExpressionValidator extends
FieldExpressionValidator
{
  public void validate(Object object) throws ValidationException
  {
    String fieldName = getFieldName();

    Boolean answer = Boolean.FALSE;
    Object obj = null;

    try
    {
      obj = getFieldValue(getExpression(), 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.");
    }

    // parent class has !answer.booleanValue()
    if (answer.booleanValue())
    {
      addFieldError(fieldName, object);
    }
  }
}

After doing this, instead of having the following expression:

    <field name="friendEmail">
        <field-validator type="fieldexpression">
            reason != null and (reason == 'friend' and friendEmail == '')
            <message>Please provide your friend's email</message>
        </field-validator>
    </field>

I get to have:

    <field name="friendEmail">
        <field-validator type="fieldexpression">
            reason == 'friend' and friendEmail == ''
            <message>Please provide your friend's email</message>
        </field-validator>
    </field>

This seems much more logical to me.

Matt




mraible wrote:
> 
> The following expression seems to do the trick:
> 
> reason != 'friend' or (reason == 'friend' and friendEmail != '')
> 
> However, this doesn't seem very intuitive, does it? Writing it in Java
> seems more logical:
> 
>   public void validate() {
>     if (reason != null && reason.equals("friend") &&
> friendEmail.equals("")) {
>       addFieldError("friendEmail", "Please provide your friend's email");
>     }
>   }
> 
> Why does the expression use the opposite (friendEmail != "") where the
> Java uses friendEmail == ""? Doesn't that seem confusing?
> 
> Matt
> 
> Eric Rank-2 wrote:
>> 
>> 
>> My Bad, there's another scenario when this field will validate. When  
>> reason != 'friend'
>> 
>> Better expression:
>> 
>> (reason != 'friend') or ((reason ==  
>> 'friend') and (friendEmail != null) and (friendEmail.trim().size() >  
>> 0))
>> 
>> Eric
>> 
>> On Jul 19, 2007, at 1:33 PM, Eric Rank wrote:
>> 
>>> Hi Matt,
>>>
>>> I tried out your scenario, and I think I found the problem. In my  
>>> test, it also validated when I left the friendEmail field blank. It  
>>> seems that the value of friendEmail is not null, but an empty  
>>> string. To solve the problem, I added another clause to check for  
>>> String length. After that, it triggered the field error as desired.  
>>> This is what worked for me.
>>>
>>> <validators>
>>>   <field name="friendEmail">
>>>         <field-validator type="fieldexpression">
>>>             reason == 'friend' and  
>>> friendEmail != null and friendEmail.trim().size() > 0
>>>             <message>Please provide your friend's email</message>
>>>         </field-validator>
>>>     </field>
>>> </validators>
>>>
>>>
>>> Eric.
>>>
>>>
>>> On Jul 19, 2007, at 10:40 AM, mraible wrote:
>>>
>>>> If you're right, I'd expect the following expression make friendEmail
>>>> required when the "friend" reason is checked (it's a radio button):
>>>>
>>>> reason == 'friend' and friendEmail != null
>>>>
>>>> However, if I check friend and don't fill out the e-mail address,  
>>>> it still
>>>> passes validation. Based on the error message I'm getting in my  
>>>> logs (see
>>>> below), I'm guessing that I need to do some sort of "friendEmail ! 
>>>> = null"
>>>> check, but I'm already doing that.
>>>
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/FieldExpressionValidator%3A-How-do-I-reference-field-names--tf4104715.html#a11989689
Sent from the Struts - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to