I am still having issues with the action setters not being called. I have
already spent several hours on this problem. Here is additional information:
Struts 2 + Struts 2 struts2-convention-plugin version: 2.2.1.1
Absolutely *none* of my actions setters are called. This problem is happening
across board with all my actions. I have re-factored all my actions recently
to make use of Struts 2 annotations. I have also done some refactoring on the
JSPs and Spring security filters. All actions were working fine before. And I
*did* see the parameters passed from the browser to the struts 2
ParameterInterceptor (see previous logs).
Below is my struts.xml and an action class with the setters that are *not*
being called.
Am I doing something wrong on my configurations and java code?
<?xml version="1.0" encoding="UTF-8" ?>
<!--
* @(#) $$Id: struts.xml 3763 2011-02-03 06:56:24Z rgomes $$
-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.devMode" value="false" />
<constant name="struts.action.extension" value="do" />
<constant name="struts.convention.default.parent.package"
value="defaultPackage" />
<constant name="struts.convention.package.locators" value="action" />
<constant name="struts.custom.i18n.resources" value="struts/resources" />
<constant name="struts.date.format" value="dd/MM/yyyy hh:mm" />
<constant name="struts.freemarker.templatesCache" value="true" />
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.serve.static" value="true" />
<constant name="struts.ui.theme" value="simple" />
<include file="struts-default.xml" />
<package name="ajaxPackage" extends="json-default">
<interceptors>
<interceptor name="secureInterceptor"
class="com.softlagos.web.struts2.interceptor.SecureInterceptor" />
<interceptor-stack name="ajaxStack">
<interceptor-ref name="params" />
</interceptor-stack>
<interceptor-stack name="secureAjaxStack">
<interceptor-ref name="ajaxStack" />
<interceptor-ref name="secureInterceptor" />
</interceptor-stack>
</interceptors>
</package>
<package name="defaultPackage" extends="struts-default">
<interceptors>
<interceptor name="fontSizeInterceptor"
class="com.softlagos.web.struts2.interceptor.FontSizeInterceptor" />
<interceptor name="valueStackInterceptor"
class="com.softlagos.web.struts2.interceptor.ValueStackInterceptor" />
<interceptor name="localeInterceptor"
class="com.softlagos.web.struts2.interceptor.LocaleInterceptor" />
<interceptor name="secureInterceptor"
class="com.softlagos.web.struts2.interceptor.SecureInterceptor" />
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="fontSizeInterceptor" />
<interceptor-ref name="valueStackInterceptor" />
<interceptor-ref name="defaultStack">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">ERROR</param>
</interceptor-ref>
<interceptor-ref name="localeInterceptor" />
</interceptor-stack>
<interceptor-stack name="secureStack">
<interceptor-ref name="myDefaultStack" />
<interceptor-ref name="secureInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack" />
<default-action-ref name="default-action" />
<global-results>
<result name="exception">/WEB-INF/content/${browser}/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>
<action name="default-action"
class="com.softlagos.web.struts2.action.DefaultAction">
<result>/WEB-INF/content/${browser}/error.jsp</result>
</action>
</package>
<package name="home" extends="defaultPackage" namespace="/">
<action name="about">
<result>/WEB-INF/content/${browser}/about.jsp</result>
</action>
<action name="error">
<result>/WEB-INF/content/${browser}/error.jsp</result>
</action>
<action name="help">
<result>/WEB-INF/content/${browser}/help.jsp</result>
</action>
<action name="language-help">
<result>/WEB-INF/content/${browser}/language-help.jsp</result>
</action>
<action name="pending-email-help">
<result>/WEB-INF/content/${browser}/pending-email-help.jsp</result>
</action>
<action name="privacy">
<result>/WEB-INF/content/${browser}/privacy.jsp</result>
</action>
<action name="remember-help">
<result>/WEB-INF/content/${browser}/remember-help.jsp</result>
</action>
<action name="terms">
<result>/WEB-INF/content/${browser}/terms.jsp</result>
</action>
<action name="terms-service">
<result>/WEB-INF/content/${browser}/terms-service.jsp</result>
</action>
</package>
<package name="secure-tools" extends="defaultPackage"
namespace="/secure/tools">
<default-interceptor-ref name="secureStack" />
<action name="view-google-contacts-import">
<result>/WEB-INF/content/${browser}/tools/google-contacts-import.jsp</result>
</action>
<action name="view-export-tools">
<result>/WEB-INF/content/${browser}/tools/export.jsp</result>
</action>
<action name="view-tools">
<result>/WEB-INF/content/${browser}/tools/tools.jsp</result>
</action>
</package>
<package name="account" extends="defaultPackage" namespace="/account">
<action name="request-pwd-confirmation">
<result>/WEB-INF/content/${browser}/account/request-pwd-confirmation.jsp</result>
</action>
<action name="reset-pwd-confirmation">
<result>/WEB-INF/content/${browser}/account/reset-pwd-confirmation.jsp</result>
</action>
</package>
<package name="secure-account" extends="defaultPackage"
namespace="/secure/account">
<default-interceptor-ref name="secureStack" />
<action name="confirm-email">
<result>/WEB-INF/content/${browser}/account/confirm-email.jsp</result>
</action>
<action name="view-change-user-language">
<result>/WEB-INF/content/${browser}/account/change-user-language.jsp</result>
</action>
</package>
<package name="secure-ssl-account" extends="defaultPackage"
namespace="/secure/ssl/account">
<default-interceptor-ref name="secureStack" />
<action name="change-login">
<result>/WEB-INF/content/${browser}/account/change-login.jsp</result>
</action>
<action name="view-change-email">
<result>/WEB-INF/content/${browser}/account/change-email.jsp</result>
</action>
<action name="view-change-password">
<result>/WEB-INF/content/${browser}/account/change-password.jsp</result>
</action>
</package>
</struts>
package com.softlagos.web.struts2.action.account;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import com.softlagos.common.Message;
import com.softlagos.common.Response;
import com.softlagos.common.validator.PasswordValidator;
import com.softlagos.domain.account.AccountResponse;
import com.softlagos.domain.account.PrivilegeType;
import com.softlagos.domain.account.RoleNameType;
import com.softlagos.domain.account.UserAccount;
import com.softlagos.domain.address.Email;
import com.softlagos.web.cookie.CookieManager;
import com.softlagos.web.cookie.CookieManagerFactory;
import com.softlagos.web.struts2.action.common.BaseAction;
/**
* Handles the registration form submit to register a user account on the
* system.
*
* @author Rubens Gomes
* @version $Id: RegisterAction.java 3657 2011-01-27 17:38:40Z rgomes $
*/
@Namespace("/ssl/account")
@Results({
@Result(name="cancel", location="/", type="redirect"),
@Result(name="error",
location="/WEB-INF/content/${browser}/account/register.jsp", type="dispatcher"),
@Result(name="input",
location="/WEB-INF/content/${browser}/account/register.jsp", type="dispatcher"),
@Result(name="success", location="/secure/addressbook/address-book.do",
type="redirect")
})
public final class RegisterAction extends BaseAction
{
private static final long serialVersionUID = 1;
private static final Log logger =
LogFactory.getLog(RegisterAction.class.getName());
static final Log newAccountLogger = LogFactory.getLog("NewAccountLogger");
private String email;
private String password;
private String confirmPassword;
private String termsAgreed;
private boolean cancel = false;
public RegisterAction()
{
super();
}
@Override
public void validate()
{
if (this.isCancel())
{
return;
}
if (StringUtils.isBlank(this.termsAgreed))
{
this.addFieldError("termsAgreed",
this.getText("error.account.termsNotAccepted"));
}
if (StringUtils.isEmpty(this.email))
{
this.addFieldError("email",
this.getText("error.account.emailRequired"));
}
else if (!Email.isEmailValid(email))
{
this.addFieldError("email",
this.getText("error.account.emailInvalid"));
}
// password
if (StringUtils.isBlank(this.password))
{
this.addFieldError("password",
this.getText("error.authentication.passwordRequired"));
}
else if (!UserAccount.isPasswordValid(this.password))
{
List<String> args = new ArrayList<String>();
args.add("" + PasswordValidator.MIN_PASSWORD_LENGTH);
args.add("" + PasswordValidator.MAX_PASSWORD_LENGTH);
this.addFieldError("password",
this.getText("error.authentication.passwordInvalid",
args.toArray(new String[0])));
}
// confirm password
if (StringUtils.isBlank(this.confirmPassword))
{
this.addFieldError("confirmPassword",
this.getText("error.authentication.passwordRequired"));
}
else if (!UserAccount.isPasswordValid(this.confirmPassword))
{
List<String> args = new ArrayList<String>();
args.add("" + PasswordValidator.MIN_PASSWORD_LENGTH);
args.add("" + PasswordValidator.MAX_PASSWORD_LENGTH);
this.addFieldError("confirmPassword",
this.getText("error.authentication.passwordInvalid",
args.toArray(new String[0])));
}
else if (!this.confirmPassword.equals(this.password))
{
this.addFieldError("confirmPassword",
this.getText("error.account.passwordsDifferent"));
}
}
@Override
public String execute()
{
if (this.isCancel())
{
return "cancel";
}
AccountResponse response =
BaseAction.accountService.createUserAccount(this.email, this.password,
this.getClientIpAddr(), RoleNameType.ROLE_USER,
PrivilegeType.READ_WRITE, this.email,
this.getLocale());
Message error = response.getErrorMessage();
if (error != null)
{
String errorMsg = this.getErrorTextMessage(error);
if (logger.isInfoEnabled())
{
logger.info("error occurred creating account: " + errorMsg);
}
this.addActionError(errorMsg);
return ERROR;
}
UserAccount account = response.getUserAccount();
Response notificationResponse =
BaseAction.notificationService.newAccountConfirmation(account.getUserProfile().getPrimaryEmail(),
this.getConfirmationUrl("/account/confirm-new-account.do"));
error = notificationResponse.getErrorMessage();
if (error != null)
{
String errorMsg = this.getErrorTextMessage(error);
if (logger.isInfoEnabled())
{
logger.info("error occurred submitting new account
notification: " + errorMsg);
}
this.addActionError(errorMsg);
return ERROR;
}
WebAuthenticationDetails details = new
WebAuthenticationDetails(this.getRequest());
Response securityResponse =
BaseAction.securityService.establishSecurityAuthentication(details,
account.getId());
error = securityResponse.getErrorMessage();
if (error != null)
{
String errorMsg = this.getErrorTextMessage(error);
if (logger.isInfoEnabled())
{
logger.info("error occurred creating account: " + errorMsg);
}
this.addActionError(errorMsg);
return ERROR;
}
// at this point an authentication has been placed on the security
context,
// and we can safely redirect the user to the contacts list page.
// store prefered language on the cookie to remember user's prefered
language.
CookieManager cookieManager =
CookieManagerFactory.getInstance(this.getRequest(), this.getResponse());
cookieManager.setLanguageCookie(this.getLocale().getLanguage());
// store the account Id on the session
this.getUserSession().setAccountId(account.getId());
if (newAccountLogger.isInfoEnabled())
{
newAccountLogger.info("-------------------------------------------------------------------");
newAccountLogger.info("Account created [" + account.getUsername() +
"]");
newAccountLogger.info("Client IP address [" +
account.getRegisteredClientIpAddress() + "]");
}
return SUCCESS;
}
/**
* @param password the password to set
*/
public void setPassword(String password)
{
this.password = password;
}
/**
* @return the password
*/
public String getPassword()
{
return this.password;
}
/**
* @return the confirmPassword
*/
public String getConfirmPassword()
{
return confirmPassword;
}
/**
* @param confirmPassword the confirmPassword to set
*/
public void setConfirmPassword(String confirmPassword)
{
this.confirmPassword = confirmPassword;
}
/**
* @return the user primary email
*/
public String getEmail()
{
return this.email;
}
/**
* @param primaryEmail the user primary email to set
*/
public void setEmail(String primaryEmail)
{
this.email = (primaryEmail != null) ? primaryEmail.trim() : null;
}
/**
* @return the terms
*/
public final String getTermsAgreed()
{
return this.termsAgreed;
}
/**
* @param terms the terms to set
*/
public final void setTermsAgreed(String terms)
{
this.termsAgreed = terms;
}
/**
* @return the cancel
*/
public boolean isCancel()
{
return cancel;
}
/**
* notice that if the corresponding button is pressed the cancel should be
set to true.
*
* @param cancel the cancel to set
*/
public void setCancel(boolean dummy)
{
this.cancel = true;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]