【发布时间】:2016-06-12 16:05:36
【问题描述】:
我目前正在设置一个使用休眠 bean 验证来验证登录页面上的表单字段的 Stuts2 应用程序。我添加了所有必要的插件和依赖项,并将 struts.xml 配置为包含一个调用 beanValidation 拦截器的自定义堆栈。 /logon 路径从 authInterceptor 中排除。不幸的是,即使填写了电子邮件和密码的表单字段,返回消息也是它们是空白的。我可以在调试器中看到在 LoginAction 类中设置了电子邮件和密码,但好像 beanValidation 没有此信息。如果我将拦截器的顺序切换到最后有 beanValidation,它永远不会被调用。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="false" />
<constant name="struts.action.extension" value="," />
<constant name="struts.custom.i18n.resources" value="login,signup" />
<constant name="struts.mapper.alwaysSelectFullNamespace"
value="false" />
<constant name="struts.beanValidation.providerClass" value="org.hibernate.validator.HibernateValidator" />
<constant name="struts.beanValidation.ignoreXMLConfiguration"
value="false" />
<constant name="struts.beanValidation.convertMessageToUtf"
value="false" />
<constant name="struts.beanValidation.convertMessageFromEncoding"
value="ISO-8859-1" />
<constant name="struts.enable.SlashesInActionNames" value="true" />
<package name="defaultPackage" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="authInterceptor"
class="com.mypackage.interceptor.AuthenticationInterceptor">
</interceptor>
<interceptor name="beanValidation"
class="org.apache.struts.beanvalidation.validation.interceptor.BeanValidationInterceptor" />
<interceptor-stack name="authStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="beanValidation">
<param name="validateAnnotatedMethodOnly">true</param>
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="authInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="authStack"></default-interceptor-ref>
<global-results>
<result name="login">/jsp/login.jsp</result>
</global-results>
<action name="login" class="com.mypackage.action.LoginAction"
method="login">
<interceptor-ref name="authStack">
<param name="excludeMethods">login</param>
</interceptor-ref>
<result name="login">/jsp/login.jsp</result>
<result name="input">/jsp/login.jsp</result>
</action>
<action name="logon" class="com.mypackage.action.LoginAction"
method="doLogon">
<interceptor-ref name="authStack">
<param name="authInterceptor.excludeMethods">doLogon</param>
</interceptor-ref>
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/login.jsp</result>
</action>
<action name="password/reset" class="com.mypackage.action.PasswordResetAction"
method="resetPassword">
<interceptor-ref name="authInterceptor">
<param name="excludeMethods">resetPassword</param>
</interceptor-ref>
<result name="reset-password">/jsp/password_reset_html.jsp</result>
</action>
<action name="register" class="com.mypackage.action.RegisterAction"
method="register">
<interceptor-ref name="authInterceptor">
<param name="excludeMethods">register</param>
</interceptor-ref>
<result name="register">/jsp/register_html.jsp</result>
</action>
<action name="doRegistration" class="com.mypackage.action.RegisterAction">
<interceptor-ref name="authInterceptor">
<param name="excludeMethods">resetPassword</param>
</interceptor-ref>
</action>
</package>
</struts>
HTML
<div class="fields-container">
<div class="field-div">
<div>
<span><s:text name="login.email" /></span>
</div>
<label class="form-label"> <input type="text" name="email"
value="" />
</label>
</div>
<div class="field-div">
<div>
<span><s:text name="login.password" /></span>
</div>
<label class="form-label"> <input type="text"
name="password" value="" />
</label>
</div>
</div>
动作类
public class LoginAction extends BaseAction {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(LoginAction.class);
@NotNull(message = "{login.error.email.empty}")
private String email;
@NotNull(message = "{login.error.password.empty}")
private String password;
public String login() {
return ActionConstants.LOGIN;
}
/**
* Perform the authentication of the user.
*
* @return The result string which maps to a jsp page.
*/
public String doLogon() {
String result = null;
return result;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
编辑 6/10/16
我更改了拦截器的执行顺序,以便 defaultStack 将首先执行,因为我的理解是它负责填充 ActionClass 中的 bean。现在,验证正在按应有的方式进行。但是,如果我将任何字段留空,则会返回正确的错误消息,但仍会调用 ActionClass 方法 doLogon。我现在正试图弄清楚如何让beanValidation 短路,以便不调用ActionClass。
【问题讨论】:
-
问题是什么?有人可以发布正确答案吗?
-
问题就在最后。 “我现在正试图弄清楚如何让 beanValidation 短路,以便不调用 ActionClass。”
标签: struts2 bean-validation hibernate-validator