I'm using Struts 1.3.
I'm trying to write a custom validator to check that 2 fields are identical.

1) I modified my validator-rules.xml by adding my own validator (called
"uguale"):
**************
validator-rules.xml
**************
<validator name="uguale"
                        
classname="it.sfidiamoci.validator.ValidatorPersonalizzati"
                        method="validateUguale"
                
methodParams="java.lang.Object,org.apache.commons.validator.ValidatorAction,org.apache.commons.validator.Field,org.apache.struts.action.ActionErrors,javax.servlet.http.HttpServletRequest"
 
                        depends="required"
                        msg="errors.uguale">
                        
<javascript><![CDATA[
        function validateUguale(form) {
            var bValid = true;
            var focusField = null;
            var i = 0;
            var fields = new Array();
            oTwoFields = new twofields();
            for (x in oTwoFields) {
                var field = form[oTwoFields[x][0]];
                var secondField = form[oTwoFields[x][2]("secondProperty")];
            
                if (field.type == 'text' ||
                    field.type == 'textarea' ||
                    field.type == 'select-one' ||
                    field.type == 'radio' ||
                    field.type == 'password') {
            
                    var value;
                    var secondValue;
                    // get field's value
                    if (field.type == "select-one") {
                        var si = field.selectedIndex;
                        value = field.options[si].value;
                        secondValue = secondField.options[si].value;
                    } else {
                        value = field.value;
                        secondValue = secondField.value;
                    }
                
                    if (value != secondValue) {
                    
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oTwoFields[x][1];
                        bValid = false;
                    }
                }
            }
            
            if (fields.length > 0) {
                focusField.focus();
                alert(fields.join('\n'));
            }
            
            return bValid;
        }]]></javascript>

</validator>

2) I modified my validation.xml by adding the new validator (called
"uguale"):
**************
validator-rules.xml
**************
<i<field property="password" depends="required,minlength,mask,uguale">
                                <arg position="0" key="errors.password" />
                                <arg position="1" name="minlength" 
key="${var:minlength}"
resource="false" />
                                <msg name="mask" key="errors.mask.password" />
                                <msg name="uguale" key="errors.password.uguale" 
/>
                                <var>
                                        <var-name>minlength</var-name>
                                        <var-value>8</var-value>
                                </var>
                                <var>
                                        <var-name>mask</var-name>
                                        <var-value>^[a-zA-Z0-9_.]*$</var-value>
                                </var>
                                <var>
                                        <var-name>secondProperty</var-name>
                                        <var-value>password2</var-value>
                                </var>
                        </field>

3) I added the key "errors.password.uguale" in
ApplicationResources.properties
***********************
ApplicationResources.properties
***********************
errors.password.uguale=Le password inserite non sono uguali

4) I created the class "ValidatorPersonalizzati" to handle the custom
validator "validateUguale":
********************
ValidatorPersonalizzati.java
********************
package it.sfidiamoci.validator;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.validator.Resources;


public class ValidatorPersonalizzati{
        
        public static boolean validateUguale(Object bean, ValidatorAction 
va,Field
field, ActionErrors errors,HttpServletRequest request){
                
                String value = 
ValidatorUtils.getValueAsString(bean,field.getProperty());
System.out.println("value="+value);
                String sProperty2 = field.getVarValue("secondProperty");
                String value2 = 
ValidatorUtils.getValueAsString(bean,sProperty2);
System.out.println("value2="+value2);
                if (!GenericValidator.isBlankOrNull(value)){
                        try{
                                if (!value.equals(value2)){
                                        
errors.add(field.getKey(),Resources.getActionMessage(request, va,
field));
                                        return false;
                                }
                        }
                        catch (Exception e){
                                
errors.add(field.getKey(),Resources.getActionMessage(request, va,
field));
                                return false;
                        }
                }
                
                return true;

        }       
}

5) I have two fields ("password", "password2") to check in my jsp:
******
test.jsp
******
<tr>
                                                        <td 
class="col1"><bean:message
key='registrazioneUtente.password.label'/></td>
                                                        <td><html:password 
property="password" styleId="password"
maxlength="<%= passwordMaxLength %>" /></td>
                                                        <td><bean:message 
key='registrazioneUtente.password2.label'/></td>
                                                        <td><html:password 
property="password2" styleId="password2"
maxlength="<%= passwordMaxLength %>" /></td>
                                                </tr>


When I submit the form in my jsp, standard validations (e.g. required,
minlength, ...) of other fields are performed in the correct way.
Instead, my own validation called "uguale" ("password==password2") doesn't
work!
On the client-side, I see a javascript warning in browser: "twofields is not
defined" but no javascript alert.
On the server-side, I get the following exception:

value=cvcxvxvczczx
value2=czzxcczxczczczcz
24-giu-2008 20.54.30 org.apache.commons.validator.ValidatorAction
executeValidationMethod
GRAVE: Unhandled exception thrown during validation: null
java.lang.NullPointerException
        at
it.sfidiamoci.validator.ValidatorPersonalizzati.validateUguale(ValidatorPersonalizzati.java:30)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at
org.apache.commons.validator.ValidatorAction.executeValidationMethod(ValidatorAction.java:544)
        at org.apache.commons.validator.Field.validateForRule(Field.java:796)
        at org.apache.commons.validator.Field.validate(Field.java:876)
        at org.apache.commons.validator.Form.validate(Form.java:288)
        at org.apache.commons.validator.Validator.validate(Validator.java:351)
        at
org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:116)
        at
org.apache.struts.chain.commands.servlet.ValidateActionForm.validate(ValidateActionForm.java:58)
        at
org.apache.struts.chain.commands.AbstractValidateActionForm.execute(AbstractValidateActionForm.java:120)
        at
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
        at
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
        at
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
        at 
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Unknown Source)

In the log I have left 2 System.out.println to be sure that "value" and
"value2" variables had the correct value submitted through the form.

Moreover, I'm not sure that 
Resources.getActionMessage(request, va, field)
method in my custom validator class is correct. This method is deprecated
and I don't know how to replace it.

I can't understand where is the problem both on client-side and on
server-side validation.

Can you help me?

Thanks in advance.
-- 
View this message in context: 
http://www.nabble.com/Struts-Validator-Framework%3A-problem-with-Custom-Validator-tp18098053p18098053.html
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