« Back

Overriding and adding struts actions from hook plugins

Company Blogs January 17, 2011 By Mika Koivisto Staff

This is a new cool feature I worked on with Brian and it’s coming on 6.1 as well as 6.0 EE SP2 and 5.2 EE SP6. With this feature you can add new struts actions to portal from a hook plugin and you can override any existing action with it.

There are two interfaces com.liferay.portal.kernel.struts.StrutsAction and com.liferay.portal.kernel.struts.StrutsPortletAction. The StrutsAction is used for regular struts actions like /c/portal/update_password and StrutsPortletAction is used for those that are used from portlets.

Let’s create a new simple hook to test it out. This hook will create a new struts path /c/portal/sample and wraps an existing struts action. Start by creating a new hook plugin in your plugins SDK. I’ll call it sample-struts-action.

./create.sh sample-struts-action

Next edit the liferay-hook.xml and add following fragment:

<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd">

<hook>
	<portal-properties>portal.properties</portal-properties>
	<custom-jsp-dir>/META-INF/custom_jsps</custom-jsp-dir>
	<struts-action>
		<struts-action-path>/portal/sample</struts-action-path>
		<struts-action-impl>com.liferay.samplestrutsaction.hook.action.SampleStrutsAction</struts-action-impl>
	</struts-action>
	<struts-action>
		<struts-action-path>/message_boards/view</struts-action-path>
		<struts-action-impl>com.liferay.samplestrutsaction.hook.action.SampleStrutsPortletAction</struts-action-impl>
	</struts-action>
</hook>

Next we need to create the struts action like below:

package com.liferay.samplestrutsaction.hook.action;

import com.liferay.portal.kernel.struts.BaseStrutsAction;
import com.liferay.portal.kernel.util.ParamUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Mika Koivisto
 */
public class SampleStrutsAction extends BaseStrutsAction {

	public String execute(
		HttpServletRequest request, HttpServletResponse response)
		throws Exception {

		String name = ParamUtil.get(request, "name", "World");

		request.setAttribute("name", name);

		return "/portal/sample.jsp";
	}

}

Next create the second Struts action. This one will actually wrap ViewAction of message boards portlet.

package com.liferay.samplestrutsaction.hook.action;

import com.liferay.portal.kernel.struts.BaseStrutsPortletAction;
import com.liferay.portal.kernel.struts.StrutsPortletAction;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

/**
 * @author Mika Koivisto
 */
public class SampleStrutsPortletAction extends BaseStrutsPortletAction {

	public void processAction(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, ActionRequest actionRequest,
			ActionResponse actionResponse)
		throws Exception {

		originalStrutsPortletAction.processAction(
			originalStrutsPortletAction, portletConfig, actionRequest,
			actionResponse);
	}

	public String render(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, RenderRequest renderRequest,
			RenderResponse renderResponse)
		throws Exception {

		System.out.println("Wrapped /message_boards/view action");

		return originalStrutsPortletAction.render(
			null, portletConfig, renderRequest, renderResponse);
	}

	public void serveResource(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, ResourceRequest resourceRequest,
			ResourceResponse resourceResponse)
		throws Exception {

		originalStrutsPortletAction.serveResource(
			originalStrutsPortletAction, portletConfig, resourceRequest,
			resourceResponse);
	}

}

Then we need to create the JSP in docroot/META-INF/custom_jsps/html/portal/sample.jsp

Hello !

And lastly we need to create portal.properties in docroot/WEB-INF/src

auth.public.paths=/portal/sample

Now we are ready to deploy the plugin and see if it works. Just run ant deploy in your plugins sdk to deploy it.

You should see following in your tomcat console:

22:01:29,635 INFO  [AutoDeployDir:167] Processing sample-struts-action-hook-6.1.0.1.war
22:01:29,638 INFO  [HookAutoDeployListener:43] Copying web plugin for /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war
  Expanding: /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war into /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF/classes
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF/classes
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/META-INF
  Copying 12 files to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/webapps/sample-struts-action-hook
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/webapps/sample-struts-action-hook
  Deleting directory /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299
22:01:30,486 INFO  [HookAutoDeployListener:49] Hook for /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war copied successfully. Deployment will start in a few seconds.
Jan 17, 2011 10:01:39 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory sample-struts-action-hook
22:01:39,727 INFO  [PluginPackageUtil:1080] Reading plugin package for sample-struts-action-hook
22:01:39,759 INFO  [HookHotDeployListener:432] Registering hook for sample-struts-action-hook
22:01:39,770 INFO  [HookHotDeployListener:717] Hook for sample-struts-action-hook is available for use

Now try to access http://localhost:8080/c/portal/sample. It will ask you to sign in and once you sign in you should see the message Hello World! in your browser. You can add a paramer name to the url to change the message. If you access message boards it will print the message "Wrapped /message_boards/view action" in tomcat console and continue to render message boards as if nothing was changed.

Now our sample was really simple one. The return value from the execute method is the view where the request is dispatched next. This can be path to JSP, an existing struts forward or tiles definition. Returning null means that your action has handled the view already. Now you could try to return for instance portal.terms_of_use to display the terms of use.

You can download this sample plugin from svn://svn.liferay.com/repos/public/plugins/trunk/hooks/sample-struts-action-hook. The username is guest and password is empty.

UPDATE: We changed the API so that the original action is passed in so that you can also wrap it with your own logic instead of replacing. I also added a new hook property auth.public.paths so it allows you to set new public paths from hooks. I also added a StrutsPortletAction into to the sample and that demonstrates wrapping an existing action.

Threaded Replies Author Date
cooooooooooooooooooool feature! Thanks a lot,... Jonas Yuan January 17, 2011 2:48 PM
Awesome Mika! I'm glad you guys worked on this. Ray Augé January 17, 2011 2:56 PM
Really Nice Features.... Good Work Mika & Team Pravin Pawar January 17, 2011 9:13 PM
Excellent! James Min January 17, 2011 9:38 PM
Hienoa Mika, this is useful feature. Sampsa Sohlman January 17, 2011 9:41 PM
Nice Feature! Jay Patel January 17, 2011 9:54 PM
Sweet! Nice work Amos Fong January 17, 2011 10:39 PM
outstanding, give more power to the hooks. thx... Armin Cyrus Dahncke January 18, 2011 1:04 AM
Awesome!! Ruth Coca January 18, 2011 4:52 AM
Great feature!! Peter Mesotten January 18, 2011 6:19 AM
This is a fantastic feature, most awaited to... Ahmed Hasan January 18, 2011 10:26 AM
We just made it even more powerful by passing... Mika Koivisto January 18, 2011 2:30 PM
Cool feature! Can't wait to get my hands on it.. Rushikesh S Thakkar January 21, 2011 3:15 PM
Great Feature. Very useful one.. Yogesh Agrawal February 5, 2011 5:19 AM
Awesome - exactly what I went looking for....... James Korotney March 16, 2011 2:14 PM
Awesome feature. Is it possible to create... Sandeep Nair March 27, 2011 10:41 PM
Yes you can use custom services in the hook... Mika Koivisto March 28, 2011 12:58 PM
[...] Luis Rodríguez Fernández: Hi Sam, I am... Anonymous May 14, 2011 11:51 PM
[...] Adding a hook to Liferay 05/06/2011 by... Anonymous June 5, 2011 2:39 PM
About one year ago, I worked in a little... Aig Loss June 24, 2011 8:57 AM
With Liferay 6.06 I am not finding... Mike Oliver July 11, 2011 7:39 PM
Nice! Do you know if is possible to override an... Roberto Barchino July 13, 2011 2:51 AM
Mike and Roberto this is only available in... Mika Koivisto July 13, 2011 11:32 AM
Hi Roberto, I've posted the jar, and a sample... Aig Loss July 13, 2011 1:32 PM
Hi Aig, is there something like zeep-o-tron for... alex wom July 18, 2011 12:56 AM
I have'nt tested it yet for that Liferay... Aig Loss July 18, 2011 4:10 AM
Hi Alex, finally I've found some time to test... Aig Loss July 23, 2011 11:27 AM
[...] Liferay just released their second... Anonymous August 2, 2011 2:13 AM
[...] If you are overriding just the jsp, you... Anonymous September 9, 2011 4:46 AM
[...] Hello, all! We want to associate journal... Anonymous September 9, 2011 1:11 PM
Realy cool. Canching the Portal will be so much... Jan Bub September 10, 2011 2:51 AM
I am trying to create a hook plugin by... Rajesh Chaurasia September 18, 2011 7:30 AM
Was a very nice feature and i tried and... Kamesh Sampath October 22, 2011 8:35 AM
[...] Following this blog, i was able use the... Anonymous October 22, 2011 8:45 AM
Rajesh Chaurasia, are you sure you have the... Mika Koivisto October 24, 2011 10:37 AM
Kamesh Sampath, can you provide me a example of... Mika Koivisto October 24, 2011 10:39 AM
Isn't this supported by simply delegating those... Ray Augé October 24, 2011 10:47 AM
Ray that would only work if you are overriding... Mika Koivisto October 24, 2011 10:53 AM
[...] I totally agree with you Jeff. One thing... Anonymous November 22, 2011 12:24 PM
I ve a similar problem of Rajesh Chaurasia i... Paolo Pilitti November 25, 2011 6:33 AM
[...] portal-properties (called portal... Anonymous November 30, 2011 11:24 AM
[...] What do you want to happen when the user... Anonymous December 1, 2011 4:04 PM
Great, informative article! Really useful... Kris Sokolovski December 2, 2011 3:49 AM
Great feature so far! ... but... I am trying... Jana Volkmer December 13, 2011 12:09 AM
I'm able to wrap the message_boards/view action... Rex Petersen December 31, 2011 12:45 PM
This is a nice feature indeeed, but there seems... Jon Haikarainen January 5, 2012 6:39 AM
I have also hit the same exact problem as Rex... Trevor Ackerman January 6, 2012 1:31 PM
Hey can you open a ticket for this and post the... Mika Koivisto January 6, 2012 1:56 PM
I'm assuming you are responding to Jon... Trevor Ackerman January 9, 2012 1:53 PM
Finally I got the ticket for the... Jon Haikarainen January 10, 2012 3:35 AM
Is this supported in 6.0.6 CE R V January 18, 2012 12:37 PM
R V this is implemented in 6.1.0 CE and... Mika Koivisto January 18, 2012 12:46 PM
When I override an existing JSP e.g. lets say... Kamesh Sampath February 7, 2012 4:01 PM
[...] Now here’s the relatively new way to... Anonymous February 10, 2012 8:18 AM
[...] Buenos días. A ver si alguien me pude... Anonymous February 13, 2012 1:47 AM
Is it posible to extend Action that are defined... Mark Stein February 21, 2012 7:34 AM
Mark, unfortunately no. You can only extend... Mika Koivisto February 21, 2012 11:14 AM
cool feature : ) Scott Lee February 27, 2012 3:07 PM
Hi all this is cool feature and i am trying to... Muradali Hasan March 28, 2012 3:03 AM
Hi, I got class cast exception when I access... Zhidao Xu April 18, 2012 7:52 PM
i want to create a hook for blog portlet and... iqbal ahmed April 19, 2012 4:35 AM
Hello Mika Koivisto and other Liferay experts, ... Elijah "Ellie" Mangason May 16, 2012 8:40 AM
[...] I have recently been working on a task to... Anonymous May 17, 2012 3:46 PM
Hello! I read your article several times, and... Elijah "Ellie" Mangason May 21, 2012 8:42 AM
[...] Hi, even if your statement is true, I got... Anonymous June 18, 2012 9:41 AM
[...] Hello, Version : Liferay EE 6.0 SP2... Anonymous July 11, 2012 2:03 AM
Hi Yana, i would like to answer (maybe too... Sven Kwiotek August 22, 2012 6:14 AM
It is a bit challenging to add a new action... Muhammed Shakir October 7, 2012 3:09 AM
Hi Does tiles-defs-ext.xml file can be put... Tomasz Sokół February 4, 2013 6:18 AM
Tiles definitions through the hook is not... Mika Koivisto February 4, 2013 9:16 AM
Hi Mohamed, when I followed the link you gave,... Nabil Bahtat July 13, 2014 6:44 AM
Hi Muhammed, I am trying to implement a... Mashuk Choudhury July 18, 2014 1:13 AM
Awesome feature, using it 1st time Liferay... Nasir Hussain December 3, 2012 3:50 AM
nice feature it is. However I'm running into... stephan t December 13, 2012 2:11 AM
Trying to do the same thing (except just on add... Gary Pinkham April 4, 2013 8:17 AM
[...] shivam aggarwal: Hi Apoorva, I was trying... Anonymous December 13, 2012 9:18 AM
[...] Hi Dave, Please refer this link. Hope... Anonymous March 17, 2013 11:59 PM
Hi, I am extending "CreateAccountAction" class... Laxman Rana April 25, 2013 6:58 AM
Laxman, I am doing something similar, but you... Steven Linzer June 12, 2013 7:25 AM
FYI, you don't even need to have as struts... Ray Augé June 12, 2013 7:35 AM
Ray, On your comment: "you don't even need to... Steven Linzer June 13, 2013 10:41 AM
Hi How to add struts action in LR 6.0.5 Thanks mohammad azaruddin May 3, 2013 3:54 AM
Same as Zhidao Xu here! I'm getting a... Juanjo Hernández Cánovas October 3, 2013 7:49 AM
Hi Mika, I tried to override /polls/view by... Nabil Bahtat February 11, 2014 1:58 PM
Nabil, we don't currently support overriding... Mika Koivisto February 11, 2014 2:16 PM
Thanks Mika, is there any workaround ? Thanks,... Nabil Bahtat February 11, 2014 9:44 PM
I'm trying to override OpenIdAction using... pspyra pspyra March 12, 2014 7:13 AM
*correct link is... pspyra pspyra April 24, 2014 3:08 AM

cooooooooooooooooooool feature! Thanks a lot, Mika and Brian.
Posted on 1/17/11 2:48 PM.
Awesome Mika! I'm glad you guys worked on this.
Posted on 1/17/11 2:56 PM.
Really Nice Features....
Good Work Mika & Team
Posted on 1/17/11 9:13 PM in reply to Ray Augé.
Posted on 1/17/11 9:38 PM.
Hienoa Mika, this is useful feature.
Posted on 1/17/11 9:41 PM.
Nice Feature!
Posted on 1/17/11 9:54 PM.
Sweet! Nice work
Posted on 1/17/11 10:39 PM.
outstanding,

give more power to the hooks. thx mika
Posted on 1/18/11 1:04 AM.
Posted on 1/18/11 4:52 AM.
Great feature!!
Posted on 1/18/11 6:19 AM.
This is a fantastic feature, most awaited to get realized thru a hook plugin. Nice Job Mika and Brian. Thank you so much.
Posted on 1/18/11 10:26 AM.
We just made it even more powerful by passing in reference to the original action so that you can just wrap it if you so wish.
Posted on 1/18/11 2:30 PM.
Cool feature! Can't wait to get my hands on it..
Posted on 1/21/11 3:15 PM.
Great Feature.
Very useful one..
Posted on 2/5/11 5:19 AM.
Awesome - exactly what I went looking for.... when can I have it :-)
Posted on 3/16/11 2:14 PM.
Awesome feature. Is it possible to create custom services in hook and then call the new services from these overrided struts action? And any hint on when liferay 6.0 EE SP2 will be released so that i can use these in my project?
Posted on 3/27/11 10:41 PM in reply to James Korotney.
Yes you can use custom services in the hook plugin from the action classes.
Posted on 3/28/11 12:58 PM in reply to Sandeep Nair.
[...] Luis Rodríguez Fernández: Hi Sam, I am extending the /announcements/edit_entry action implementing a hook. I have created a hook project and in the src folder I have my implementation of the... [...] Read More
Posted on 5/14/11 11:51 PM.
[...] Adding a hook to Liferay 05/06/2011 by Steffen Luypaert Leave a Comment In this article, we elaborate on Liferay hooks, which are a type of plugin for the Java-based Liferay portal. We discuss what... [...] Read More
Posted on 6/5/11 2:39 PM.
About one year ago, I worked in a little development that allowed me to override/add, struts actions, tiles configurations, spring beans, and add classs to Liferay usng hooks...
You con find some clues in a 3-posts series at http://aigloss.blogspot.com/2011/04/liferay-portal-server-avoiding-use-of.html.
I­'ve been using it in productin environments since there and has been tested in LF5.1.2 (it was originally developed for that LF version), ang earlier versions of Liferay 6 CE.
Posted on 6/24/11 8:57 AM in reply to .
With Liferay 6.06 I am not finding com.liferay.portal.kernel.struts.BaseStrutsAction to import.
Posted on 7/11/11 7:39 PM.
Nice!
Do you know if is possible to override an struts action in a hook without using ext--enviroment in liferay 5.2.3? Because in the DTD hook of liferay 5.2.3 there are the <struts-action> tags... but know I see that this will be a new functionality of liferay 6.1.
I'm little bit confusing.

Can anyone help me?

Thank you.
Posted on 7/13/11 2:51 AM in reply to Mike Oliver.
Mike and Roberto this is only available in upcoming 6.1 and 6.0 EE SP2 and 5.2 EE SP6. Neither 6.0 CE or 5.2 CE has this feature as it was developed after their release.
Posted on 7/13/11 11:32 AM in reply to Roberto Barchino.
Hi Roberto,
I've posted the jar, and a sample hook for Liferay 5.2.3 with the module I was talking in the other post. As told, using that you'll be able to override/add struts configs and actions, tiles configs, spring beans, plus any other thing Liferay allow you to do using hook.
You can check that sample out at http://aigloss.blogspot.com/2011/07/liferay-portal-server-avoiding-use-of.html
Ho­pe you like it!
Posted on 7/13/11 1:32 PM in reply to Mika Koivisto.
Hi Aig, is there something like zeep-o-tron for Liferay 6.0.6?
Posted on 7/18/11 12:56 AM in reply to Aig Loss.
I have'nt tested it yet for that Liferay version, but, unless there is some package modification or something like that, it will surely work.
I'll try to test it and upload a working sample for LF 6.0.6 during this week. Just uploaded it for 5.2.3 first because of Roberto needs.
Posted on 7/18/11 4:10 AM in reply to alex wom.
Hi Alex,
finally I've found some time to test it on LF 6.0.6 and make some modifications. You can find the details here: http://aigloss.blogspot.com/2011/07/zeep-otron-for-liferay-6.html.

Hope you like it!
Posted on 7/23/11 11:27 AM in reply to Aig Loss.
[...] Liferay just released their second service pack for 6.0 enterprise customers. Apart from lost of small bug fixes, they included one welcome enhancement to the hooks system: overriding struts actions... [...] Read More
Posted on 8/2/11 2:13 AM.
[...] If you are overriding just the jsp, you could do that via hook. If you are overriding struts action ,you may have to use the ext-plugin until overriding them is available via plugins.... [...] Read More
Posted on 9/9/11 4:46 AM.
[...] Hello, all! We want to associate journal articles to polls in such a way that we can automatically provide a link to an article when showing a poll. For that, we intend to follow the following steps:... [...] Read More
Posted on 9/9/11 1:11 PM.
Realy cool. Canching the Portal will be so much easier.
Posted on 9/10/11 2:51 AM.
I am trying to create a hook plugin by extending the class EditPagesAction .I have provided my version of action class with name NPPEditPagesAction.I am able to deploy my plugin into liferay .But I am not able to excute my implemention class code given in NPPEditPagesAction.I tried to set breakpoint in my code but I am not able to get the Debug perspecetive in eclipse.
hook.xml:
--------------
<hook>
<custom-jsp-dir>/WEB-INF</custom-jsp-dir>
­<struts-action>
<struts-action-path>/layout_management/edit_pages</struts-acti­on-path>
<struts-action-impl>com.liferay.portlet.communities.action.NPPEditPag­esAction</struts-action-impl>
</struts-action>
</hook>


Implementiaon :

public class NPPEditPagesAction extends EditPagesAction {

public void processAction(ActionMapping mapping, ActionForm form,
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse) throws Exception {

System.out.println("Inside processAction...createTheme()");
String cmd = ParamUtil.getString(actionRequest, Constants.CMD);

try {
if (cmd.equals("createtheme")) {
createTheme(actionRequest);
}

super­.processAction(mapping, form, portletConfig, actionRequest,actionResponse);

} catch (Exception e) {

}
}

public ActionForward render(ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
RenderRequest renderRequest, RenderResponse renderResponse)
throws Exception {

return super.render(mapping, form, portletConfig, renderRequest, renderResponse);
//return mapping.findForward(getForward(renderRequest, "portlet.communities.edit_pages"));

}

@SuppressWarnings("static-access")
publ­ic static void createTheme(ActionRequest actionRequest) {

System.out.println("Inside createTheme...");
ThemeUtil themeUtil = new ThemeUtil();
final String themeZipFilePath = ThemeUtil.SAMPLE_THEMES_PATH;
final String themeConfigFilePath = ThemeUtil.THEMES_CONFIG_PATH;
try{
//To Modify liferay-look-and-feel.xml
themeUtil.getXMLDetails(themeConfigFilePath);
­
//To Extract the sample themes zip folder to tomcat location
themeUtil.extractFolder(themeZipFilePath);

} catch (Exception ex) {
ex.printStackTrace();
}

}

///edit_pages_look_and_feel.jsp
<liferay-ui:­section>
<div style="width: 40%;">theme name:</div>
<input type="text" id="name">
<div style="width: 40%;">theme id:</div>
<input type="text" id="id"><br>
<div style="width: 40%;">body background:</div>
<input type="text" id="background" class="color"><br>
<div style="width: 40%;">bgcolor:</div>
<input type="text" id="bgcolor" class="color"><br>
<input type="button" value="<liferay-ui:message key="save" />" onclick="<portlet:namespace />createTheme();" />
</liferay-ui:section>


edit_pages.jsp
---------------

function <portlet:namespace />createTheme() {
alert("Hi:Inside createtheme....");
document.<portlet:namespace />fm.<portlet:namespace /><%= Constants.CMD %>.value = "createtheme";
submitForm(document.<portlet:namespace />fm);
}
Posted on 9/18/11 7:30 AM.
Was a very nice feature and i tried and implemented it successfully. I have small requirement not sure that is doable or not, i need to redirect to an existing Struts Action in one of the conditions during the render of the BaseStrutsPortletAction case. e..g redirecting to path "login/login"
Posted on 10/22/11 8:35 AM.
[...] Following this blog, i was able use the Struts Action hook to add new functionality to my existing hook . Now after doing my hook logic, i want to do a redirection or forward to an existing struts... [...] Read More
Posted on 10/22/11 8:45 AM.
Rajesh Chaurasia, are you sure you have the right struts-path? Some of the paths are changed automatically by com.liferay.portal.struts.StrutsActionPortletURL so that the path matches the struts-path of the portlet. This can be quite confusing because the struts path in the jsp is different that what is actually rendered.
Posted on 10/24/11 10:37 AM in reply to .
Kamesh Sampath, can you provide me a example of how would you do that with plain Struts? It might be possible if it's not then it might be something to consider adding.
Posted on 10/24/11 10:39 AM in reply to Mika Koivisto.
Isn't this supported by simply delegating those cases back to:

"originalAction" which is the value of the execute's method ActionMapping parameter?
Posted on 10/24/11 10:47 AM in reply to Mika Koivisto.
Ray that would only work if you are overriding that particular action. If you want to redirect from one action to another it would work. Well you could use response.sendRedirect().
Posted on 10/24/11 10:53 AM in reply to Ray Augé.
[...] I totally agree with you Jeff. One thing i want to know i was looking into LR 6.1 CE B4 I had a look into MD Messages related code. Actually controller in this case was EditMessageAction extends... [...] Read More
Posted on 11/22/11 12:24 PM.
I ve a similar problem of Rajesh Chaurasia

i want override ...action.GetCategoriesAction
so i write the liferay-hook.xml

<struts-action>
<struts-action-path>/asset/get_categories</str­uts-action-path>
<struts-action-impl>it.reply.open.wt.asset.action.GetCategori­esAction</struts-action-impl>
</struts-action>

but when in my code it invokes this action it uses :
url: themeDisplay.getPathMain() + '/asset/get_categories'

adding the pathMain ( that in my case is /c/ ) so it cant find the action class...
but if i dont add the pathMain it cant find url.



there is a solution for this?
Posted on 11/25/11 6:33 AM in reply to .
[...] portal-properties (called portal properties hooks), language-properties (called language properties hooks), custom-jsp-dir (called custom JSPs hooks), custom-jsp-global (applying custom JSPs hooks... [...] Read More
Posted on 11/30/11 11:24 AM.
[...] What do you want to happen when the user presses decline ? i think many scenarios could be solved with a simple jsp hook. If you really need to change the action then you need to override it in ext if... [...] Read More
Posted on 12/1/11 4:04 PM.
Great, informative article! Really useful feature!

But I was stuck in one silly mistake in my liferay-hook.xml. The ORDER of elements really MATTERS!
It should be as described in "liferay-hook_6_0_0.dtd" (don't pay attention to version).

My liferay-hook.xml was:
<hook>
<custom-jsp-dir>/WEB-INF/custom_jsps</custom-jsp-dir>
<portal-propert­ies>portal.properties</portal-properties>
</hook>

This needed to be:
<hook>
<portal-properties>portal.properties</portal-properties>
<custom-jsp-d­ir>/WEB-INF/custom_jsps</custom-jsp-dir>
</hook>

I had problems to deploy it, and have gotten such ERROR:
ERROR [HotDeployUtil:114] com.liferay.portal.kernel.deploy.hot.HotDeployException: Error registering hook for Search1-hook
com.liferay.portal.kernel.deploy.hot.HotDeployException: Error registering hook for Search1-hook
at com.liferay.portal.kernel.deploy.hot.BaseHotDeployListener.throwHotDeployExcepti­on(BaseHotDeployListener.java:46)
at com.liferay.portal.deploy.hot.HookHotDeployListener.invokeDeploy(HookHotDeployLi­stener.java:271)
at com.liferay.portal.kernel.deploy.hot.HotDeployUtil._doFireDeployEvent(HotDeployU­til.java:111)
at com.liferay.portal.kernel.deploy.hot.HotDeployUtil._fireDeployEvent(HotDeployUti­l.java:188)
at com.liferay.portal.kernel.deploy.hot.HotDeployUtil.fireDeployEvent(HotDeployUtil­.java:40)
at com.liferay.portal.kernel.servlet.HookContextListener.contextInitialized(HookCon­textListener.java:36)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4205­)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4704)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1282)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1380)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:306)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.ja­va:142)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1385­)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChild­ren(ContainerBase.java:1649)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChild­ren(ContainerBase.java:1658)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(Containe­rBase.java:1638)
at java.lang.Thread.run(Thread.java:619)

I am glad it's resolved now, hope this will help others!
Posted on 12/2/11 3:49 AM.
Great feature so far! ... but...

I am trying to create a jsp-Hook for the portlet-configuration tabs. I already figured out, my struts action has to extend BaseStrutsPortletAction. But if I add my own Action there, I get the error

2011-12-12 16:04:00 ERROR [PortletRequestProcessor:377] Forward does not exist

Any help or hint would be great!

(see also: this forum post )
Posted on 12/13/11 12:09 AM.
I'm able to wrap the message_boards/view action as you describe here. But when I attempt to wrap /login/facebook_connect_oauth I get a runtime exception: com.liferay.portal.struts.PortletActionAdapter cannot be cast to com.liferay.portal.struts.ActionAdapter.

If I instead extend the class BaseStrutsAction as below, the facebook login functionality ceases to work properly. Is there something fundamentally different about the FacebookConnectAction class or am I doing something wrong?

public class FacebookMyConnectAction extends BaseStrutsAction {

@Override
public String execute(StrutsAction originalStrutsAction,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// TODO Auto-generated method stub
return super.execute(originalStrutsAction, request, response);
}
Posted on 12/31/11 12:45 PM in reply to Jana Volkmer.
This is a nice feature indeeed, but there seems to be a bug when wrapping actions that are sending redirects. In my case I'm trying to wrap com.liferay.portal.action.LoginAction (/c/portal/login) with a custom action.

In liferay-hook.xml I have the following:

<hook>
<portal-properties>portal.properties</portal-properties>
<struts-action>
<struts-action-path>/portal/login</struts-action-path>
<struts-action-impl>PortalLoginAction</struts-action-impl>
</struts-action>
</hook>

Then, my PortalLoginAction -class has the following appearance:

public class PortalLoginAction extends BaseStrutsAction {

@Override
public String execute(StrutsAction originalStrutsAction, HttpServletRequest request, HttpServletResponse response)
throws Exception {
//custom code
return originalStrutsAction.execute(request, response);
}
}

Everything works well here until reaching the execution of the original action. The problem seems to be that LoginAction.execute() uses response.sendRedirect() and returns null. The execute() method in com.liferay.portal.struts.StrutsActionAdapter in turn expects the original action to return an ActionForward, thus resulting in a NullPointerException (line 48).

Does anyone know a workaround for this problem? I'm using Liferay 6 EE SP2 and I wouldn't like to make any custom fixes to the code.
Posted on 1/5/12 6:39 AM.
I have also hit the same exact problem as Rex Petersen has above. In my case I am trying to override the action for the UpdateReminderQueryAction. The blog post does not make it obvious why the wrapper example above is extending BaseStrutsPortletAction. It is doing so because the action class for message boards view extends PortletAction.

Rex, in the body of your execute method listed above replace the call to super.execute() with this instead:

return originalStrutsAction.execute(request, response);

Mika, if you could enhance your blog to mention this part of the process it would be greatly appreciated.
Posted on 1/6/12 1:31 PM in reply to Jon Haikarainen.
Hey can you open a ticket for this and post the ticket number here. It should work with returning null as the forward.
Posted on 1/6/12 1:56 PM in reply to Trevor Ackerman.
I'm assuming you are responding to Jon Haikarainen. right?
Posted on 1/9/12 1:53 PM in reply to Mika Koivisto.
Finally I got the ticket for the NullPointerException -case created: LPS-24734.

Personally I don't however have a problem with this anymore as it turned out that customizing the action wasn't necessary in this case.
Posted on 1/10/12 3:35 AM in reply to Trevor Ackerman.
Is this supported in 6.0.6 CE
Posted on 1/18/12 12:37 PM.
R V this is implemented in 6.1.0 CE and backported to 6.0 EE SP2 so not available in 6.0.6 CE.
Posted on 1/18/12 12:46 PM in reply to R V.
When I override an existing JSP e.g. lets say blogs/search.jsp, I faced couple of problems

1. I am not able to use the existing struts path "/blogs/search" eventhough I override the same in my hook.xml, its picking my class only when I give a alternate search path like "/blogs/search1"

2. When i return the existing JSP page via the Struts Portlet Action render method I see the basic Portlet CSS styles are gone.

Any thoughts on what I am missing and ways to fix them ?
Posted on 2/7/12 4:01 PM in reply to Mika Koivisto.
[...] Now here’s the relatively new way to inject our own logic for this struts action without resorting to the Ext mechanism. (The current documentation on how to do this may be found in this Liferay Blog... [...] Read More
Posted on 2/10/12 8:18 AM.
[...] Buenos días. A ver si alguien me pude echar una mano con mi problema. Estoy desarrollando un hook del Asset Publisher en el cual es necesario que añada un nuevo checkbox en la pagina de configuración... [...] Read More
Posted on 2/13/12 1:47 AM.
Is it posible to extend Action that are defined in liferay/.../liferay-portlet.xml, for examle:

<portlet>
<portlet-name>56</portlet-name>
<icon>/html/icons/journal_content.­png</icon>
<struts-path>journal_content</struts-path>
<configuration-action-­class>com.liferay.portlet.journalcontent.action.ConfigurationActionImpl</configu­ration-action-class>
...
Posted on 2/21/12 7:34 AM in reply to .
Mark, unfortunately no. You can only extend actions that are defined in struts-config.xml
Posted on 2/21/12 11:14 AM in reply to Mark Stein.
cool feature : )
Posted on 2/27/12 3:07 PM in reply to Mika Koivisto.
Hi all
this is cool feature and i am trying to implement this but i have one question
the default liferay action classes extends PortletAction class which is in portal-impl has method like getForward(),setForward(),sendRedirect(),

now when i am override class i am replacing extends PortletAction with BaseStrutsPortletAction in that i am unable to get those methods for that what i need to change any one can give update
Posted on 3/28/12 3:03 AM in reply to Scott Lee.
Hi,
I got class cast exception when I access URL : [localhost:8080/c/message_boards/view]

02:50:33,129 ERROR [StripFilter:59] java.lang.ClassCastException: com.liferay.portal.struts.PortletActionAdapter cannot be cast to com.liferay.porta
struts.ActionAdapter
java.lang.ClassCastException: com.liferay.portal.struts.PortletActionAdapter cannot be cast to com.liferay.portal.struts.ActionAdapter
at com.liferay.portal.struts.PortalRequestProcessor.processActionCreate(PortalReque­stProcessor.java:485)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:230)
at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.­java:174)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:533)
at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:510)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilt­erChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.­java:210)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:72)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.j­ava:304)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
at com.liferay.portal.servlet.filters.gzip.GZipFilter.processFilter(GZipFilter.java­:123)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
at com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilte­r.java:201)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
at com.liferay.portal.servlet.filters.sso.ntlm.NtlmPostFilter.processFilter(NtlmPos­tFilter.java:83)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.ja­va:80)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(V­irtualHostFilter.java:208)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDire­ctCallFilter(InvokerFilterChain.java:184)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.jav­a:738)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFi­lter(InvokerFilterChain.java:203)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:105)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDire­ctCallFilter(InvokerFilterChain.java:164)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:92)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDire­ctCallFilter(InvokerFilterChain.java:164)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:92)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDire­ctCallFilter(InvokerFilterChain.java:184)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(In­vokerFilterChain.java:92)
at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(Invoker­Filter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilt­erChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.­java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:2­24)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:1­69)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.jav­a:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118­)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor­.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractPro­tocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)­
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:8­86)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Posted on 4/18/12 7:52 PM.
i want to create a hook for blog portlet and add image uploading and displaying those images in thumnails how should i proceed
Posted on 4/19/12 4:35 AM.
Hello Mika Koivisto and other Liferay experts,

I need to validate users on login with information they will enter into custom fields compared with that which is already in the database. After validation, I want to proceed to the login process by issuing them a temporary password. Can this be done in a hook-struts override using CreateAccountAction? Any help, tips, advice you have would be most appreciated. Thanks in advance!
Posted on 5/16/12 8:40 AM in reply to iqbal ahmed.
[...] I have recently been working on a task to customize some of the aspects of Liferay's built in Login portlet. This article describes how to take advantage of the simple configuration items provided by... [...] Read More
Posted on 5/17/12 3:46 PM.
Hello!
I read your article several times, and found it to be very useful. I have implemented many of the features you outlined so clearly in your post. THANKS! The situation now is that we have a database of users that have some fields pre-populated: first name, last name, gender, and birthdate. On first time login, I need them to complete their registration, then login. I'm wondering which fields will trigger the Associate Account button, which allows a user to complete the login process. Any ideas?
Posted on 5/21/12 8:42 AM in reply to .
[...] Hi, even if your statement is true, I got the error : Only a type can be imported. x.y.service.XServiceUtil resolves to a package When accessing to my service in my override jsp. As Maxim Kovalev, I... [...] Read More
Posted on 6/18/12 9:41 AM.
[...] Hello, Version : Liferay EE 6.0 SP2 Business case: Override the terms of use according to the login user role I am trying to override the UpdateTermsOfUseAction class using liferay hook as per the... [...] Read More
Posted on 7/11/12 2:03 AM.
Hi Yana,
i would like to answer (maybe too late...)
try use in your overridden render method:
return originalStrutsPortletAction.render(originalStrutsPortletAction, portletConfig, renderRequest, renderResponse);
Posted on 8/22/12 6:14 AM in reply to .
It is a bit challenging to add a new action with a custom jsp and ensuring that the jsp is wrapped into the theme properly. I have got the solution and it works like a charm. You can find the solution here : http://www.liferayaddict.com/home/-/blogs/new-action-in-hook-in-liferay-6-1
Posted on 10/7/12 3:09 AM in reply to Sven Kwiotek.
Awesome feature, using it 1st time Liferay rocks emoticon
Posted on 12/3/12 3:50 AM.
nice feature it is. However I'm running into problems with my example:
I would like to override only one method (the processAction method) of the EditUserAction (enterprise-admin). I ended up with the following:
public class MyEditUserAction extends BaseStrutsPortletAction {

@Override
public void processAction(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse) throws Exception {

String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
...

now the obvious problem: How do I access the protected methods implemented in the original EditUserAction, like sendRedirect() or addUser()?
Normally I would have extended EditUserAction overriding just one method. But with the Action sitting in portal-impl I can't and have to use the BaseStrutsPortletAction. So it seems I have to repeat the complete implementation of EditUserAction in MyEditUserAction, which I consider not good practice and not upgrade-safe.
What we'd need is a wrapper mechanism as it exists for services.
Any ideas on this?

Thanks.
Posted on 12/13/12 2:11 AM.
[...] shivam aggarwal: Hi Apoorva, I was trying to implement the solution you provided.Regarding the CustomLayoutAction class,I used a hook for it. But on deployment,following exception is thrown Caused by:... [...] Read More
Posted on 12/13/12 9:18 AM.
Hi
Does tiles-defs-ext.xml file can be put inside a hook or do I need to use ext plugin? I am looking a way to add a custom tiles definitions without using EXT. Is this possible?
Posted on 2/4/13 6:18 AM in reply to Muhammed Shakir AK Misarwala.
Tiles definitions through the hook is not currently supported.
Posted on 2/4/13 9:16 AM in reply to Tomasz Sokół.
[...] Hi Dave, Please refer this link. Hope that helps Thanks Rahul Sign in to vote. Flag Please sign in to flag this as inappropriate. Mark as an Answer [...] Read More
Posted on 3/17/13 11:59 PM.
Trying to do the same thing (except just on add user).. Have you come to a better conclusion than rewriting the entire action class? I guess there's falling back to Ext-plugin which I was just about to do when I noticed this post about using hooks instead.. (already have a hook so would be better to just add something to it vs creating a whole new ext-plugin)
Posted on 4/4/13 8:17 AM in reply to stephan t.
Hi,
I am extending "CreateAccountAction" class in custom-hook for overriding action mapping in 'struts-config.xml' b'coz i wanted to override default create-account mechanism to include extra fields for user but while deploying hook i'm getting following error.

Caused by: java.lang.NoClassDefFoundError: com/liferay/portlet/login/action/CreateAccountAction

can you help me to resolve this.
Posted on 4/25/13 6:58 AM.
Hi
How to add struts action in LR 6.0.5
Thanks
Posted on 5/3/13 3:54 AM.
Laxman,

I am doing something similar, but you can not override PortletAction. You can override the action mapping so that your class will be executed before the CreateAccountAction or EditUserAction class is executed. This will help because you can run validation on the user input; if the input is good, your class will re-route the execution to CreateAccountAction. Else, you can throw an error to the screen.
Secondly, are your "extra fields" custom fields? If so, the New User screen does not show the custom fields tab. Only the update user does.

Steve
Posted on 6/12/13 7:25 AM in reply to Laxman Rana.
FYI, you don't even need to have as struts action mapping/wrapper in order to "get" the values of custom fields included in any UI, whether those fields are actually liferay's "custom fields" OR just some arbitrary input fields that were glued into place. The ServiceContext object has a Map called "attributes" (Map<String,Serializable>) which contains all the request parameters by name.

So, suppose you have a "ServiceWrapper" (including methods which don't actually have a "ServiceContext" parameter). You can get the request parameters there.

Where the ServiceContext is a parameter, then you simply need to get the parameter by calling:

serviceContext.getAttribute("name")

OR for safety:

ParamUtil.getString(serviceContext, "name", "default");

If you happen to be in a method which does NOT have a ServiceContext parameter, do not fret. There is a thread local specially for that:

ServiceContextThreadLocal.getServiceContext()

HTH
Posted on 6/12/13 7:35 AM in reply to Steven Linzer.
Ray,

On your comment: "you don't even need to have as struts action mapping/wrapper in order to "get" the values of custom fields", I agree fully. I was just saying that in order to "add to" the create/edit user functionality such as adding some server-side validation, you would need to override that action in the struts-config (in a hook) and insert your own StructsPortletAction.

Regards,
Steve
Posted on 6/13/13 10:41 AM in reply to Ray Augé.
Same as Zhidao Xu here! I'm getting a ClassCastException:
com.liferay.portal.struts.ActionAdapter cannot be cast to com.liferay.portal.struts.PortletActionAdapter
I have made a message entry for this issue: https://www.liferay.com/es/community/forums/-/message_boards/message/30102664
Posted on 10/3/13 7:49 AM.
Hi Mika,
I tried to override /polls/view by extending BaseStrutsPortletAction,
I referenced my struts action classe in my file liferay-hook.xml.
The probleme is whenI deploy my hook, my classe action iss never called.
I Wonder if it's not because in struts-config.xml action /polls/view is not referencin a classe action but a jsp (<action path="/polls/view" forward="portlet.polls.view"/>).
Please can you help me to overcome this issue.
Many thanks.
Nabil
Posted on 2/11/14 1:58 PM.
Nabil, we don't currently support overriding forwards. There's a feature request for that. https://issues.liferay.com/browse/LPS-44115
Posted on 2/11/14 2:16 PM in reply to Nabil Bahtat.
Thanks Mika,
is there any workaround ?
Thanks,
Nabil
Posted on 2/11/14 9:44 PM in reply to Mika Koivisto.
I'm trying to override OpenIdAction using feature described in this article, but I am getting NoClassDefFoundError exceptions. I described my problem here
https://www.liferay.com/community/forums/-/message_boards/view_message/35589­747#_19_message_35589747
Is it possible to override OpenIdAction with the method you described?
Posted on 3/12/14 7:13 AM.
*correct link is
https://www.liferay.com/community/forums/-/message_boards/message/35589747
Posted on 4/24/14 3:08 AM in reply to pspyra pspyra.
Hi Mohamed,
when I followed the link you gave, I could not find your source code.
Please I need your help.
Thanks,
Nabil
Posted on 7/13/14 6:44 AM in reply to Muhammed Shakir AK Misarwala.
Hi Muhammed,
I am trying to implement a similar thing where I have a custom jsp and trying to load a theme up for the custom jsp. I tried accessing the link that you provided, but it does not work. If you have another link or could provide some pointers, I would be very grateful.

Thanks
Mashuk
Posted on 7/18/14 1:13 AM in reply to Muhammed Shakir AK Misarwala.