1
votes

I am trying to do simple validation using validaton.xml, the validation is working for username which is of type string but not for password which is of type int.

Action class

public class LoginAction extends ActionSupport  {
private static final long serialVersionUID = 5271055255991498361L;
private String username;
private int password;

public String execute() {

    if (this.username.equals("admin")&& this.password==123) {
        addActionMessage("Welcome admin");
        return SUCCESS;
    } else {
        addActionError("Invalid credentials");
        return ERROR;
    }
}

public String getUsername() {

    return username;
}

public void setUsername(String username) {

    this.username = username;
}

public int getPassword() {
    return password;
}

public void setPassword(int password) {
    this.password = password;
}
}

LoginAction-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators> 
    <field name="username"> 
        <field-validator type="requiredstring"> 
            <message>Please enter a user name</message> 
        </field-validator> 
    </field> 

    <field name="password"> 
        <field-validator type="required"> 
            <message>Please enter a password</message> 
        </field-validator> 
    </field> 
</validators>

struts.xml

<struts>
    <constant name="struts.action.extension" value=","/>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" />

    <package name="user" namespace="/" extends="struts-default">
        <action name="login" class="net.training.user.action.LoginAction"   method="execute">
          <result name = "input">Login.jsp</result>
          <result name = "error">Login.jsp</result>    
          <result name= "success">/customer/CustomerForm.jsp</result>
        </action>
    </package>

</struts>

The error reported was

WARNING: Error setting expression 'password' with value '[Ljava.lang.String;@1f2428d'
ognl.MethodFailedException: Method "setPassword" failed for object net.training.user.action.LoginAction@1d532ae [java.lang.NoSuchMethodException: net.training.user.action.LoginAction.setPassword([Ljava.lang.String;)]
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1305)
    at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1494)
    ...
Caused by: java.lang.NoSuchMethodException: net.training.user.action.LoginAction.setPassword([Ljava.lang.String;)
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1246)
    ... 63 more
/-- Encapsulated exception ------------\
java.lang.NoSuchMethodException: net.training.user.action.LoginAction.setPassword([Ljava.lang.String;)
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1246)
    at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1494)
    ...
\--------------------------------------/
Jul 24, 2013 3:26:18 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'password' on 'class net.training.user.action.LoginAction: Error setting expression 'password' with value '[Ljava.lang.String;@1f2428d'
Error setting expression 'password' with value '[Ljava.lang.String;@1f2428d' - Class: ognl.OgnlRuntime
File: OgnlRuntime.java
Method: callAppropriateMethod
Line: 1305 - ognl/OgnlRuntime.java:1305:-1
    at com.opensymphony.xwork2.ognl.OgnlValueStack.handleOgnlException(OgnlValueStack.java:211)
    at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:172)
    ...
Caused by: ognl.MethodFailedException: Method "setPassword" failed for object net.training.user.action.LoginAction@1d532ae [java.lang.NoSuchMethodException: net.training.user.action.LoginAction.setPassword([Ljava.lang.String;)]
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1305)
    at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1494)
    ...
Caused by: java.lang.NoSuchMethodException: net.training.user.action.LoginAction.setPassword([Ljava.lang.String;)
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1246)
    ... 63 more

Login.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>

<body>
<h2>Struts 2 - Login Application</h2>

<s:actionerror/>
<s:fielderror/>

<s:form action="login" method="post" namespace="/" > 
    <s:textfield name="username" key="label.username" size="20" />
    <s:textfield name="password" key="label.password" size="20" />
    <s:submit  />
</s:form>
</body>
</html>

Struts version : 2.3.15

2
That's clearly not a validation issue, rather a config or form issue. Setting ints works, so I suspect something else is wrong, but cannot test anything at this time. - Dave Newton
@DaveNewton give me some direction, where should I look into.. I am not able to figure it out. - wolverine
What version of S2? What's the form look like? Do you have a SSCCE on github/etc I can check out? - Dave Newton
@DaveNewton I have edited to add the details - wolverine
Also, I'm not excited about using an int field for a password; you lose a lot of flexibility this way. - Dave Newton

2 Answers

0
votes

IMO looks like that you're using a required for an int field. I guess you should use an int type of validator. The required validator checks for null, struts2 required validator.

You should do something like:

   <field name="password"> 
        <field-validator type="int"> 
            <param name="min">0</param>
            <message>Please enter a password</message> 
        </field-validator> 
    </field> 
</validators>
0
votes

If I use Integer instead of int then it works fine.