2013-07-24 175 views
1

我正在尝试使用validaton.xml进行简单验证,验证工作的用户名是字符串类型,但不是用于int类型的密码。Struts 2 validation.xml不起作用

Action类

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> 

报告该错误是

WARNING: Error setting expression 'password' with value '[Ljava.lang.String;@1f2428d' 
ognl.MethodFailedException: Method "setPassword" failed for object [email protected] [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 [email protected] [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的版本:2.3.15

+1

这显然不是验证问题,而是配置或表单问题。设置整数是有效的,所以我怀疑其他的东西是错的,但是现在不能测试任何东西。 –

+0

@DaveNewton给了我一些方向,我应该在哪里看看..我无法弄清楚。 – wolverine

+0

什么版本的S2?表单是什么样的?你有github上的SSCCE/etc我可以检查吗? –

回答

0

IMO看起来像您使用的是requiredint场。我想你应该使用int类型的验证器。所需的验证器检查nullstruts2 required validator。如果我使用整数,而不是整数,那么它工作正常

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

如果我把一些范围不包括零,然后它进行验证...但如果范围包含零,它会提交空的表单......但在这两种情况下,它会引发我在问题中提到的异常......应该可以将require int状态的条件没有提及任何范围。 – wolverine