struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Shailesh Arvind Vaishampayan (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (WW-4234) Ability to catch service layer exceptions at one place and allow adding action messages/errors before results are rendered
Date Sun, 27 Oct 2013 12:15:31 GMT

    [ https://issues.apache.org/jira/browse/WW-4234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13806317#comment-13806317
] 

Shailesh Arvind Vaishampayan commented on WW-4234:
--------------------------------------------------

@Lukasz : Yes i did. Please see below by custom interceptor :

public class BusinessExceptionInterceptor extends BaseInterceptor {

	@Override
	public String intercept(ActionInvocation ai) throws Exception {
		String result = null;
		try{
			result = ai.invoke();
		}catch(BusinessException e){
                        ActionSupport as = (ActionSupport)ai.getAction();
                        as.addActionMessage(e.getMessage());
                        //OR throw e
 		}
		
		return result //have to comment this out if i am throwing exception from catch instead of
swallowing it;
	}

}

my action config is as follows :

<package name="client" extends="default" namespace="/client">
    	<interceptors>
    		<interceptor name="busineesClientException" class="com.jkweb.web.interceptors.BusinessExceptionInterceptor"></interceptor>
    	</interceptors>
    	<action name="showProject" class="com.jkweb.web.actions.client.ClientAction" method="test">
    			<exception-mapping result="showProject" exception="com.jkweb.exception.BusinessException"
>
    			</exception-mapping>
    			<interceptor-ref name="busineesClientException"></interceptor-ref>
    			<result name="showProject" type="tiles" >showProject</result>
    	</action>
    </package>

And my action class method is below :

	public String test() throws Exception{
		
		throw new BusinessException("test message");
		//return "success"; 
		
	}
However my result variable does not get initialized as action invocation throws an exception.
So if i swallow the exception in my custom interceptor by adding action message result is
null and nothing happens.

Contrary to that if I add action message and throw the exception as it is, stack trace is
displayed  which i don't want.

What i want is 
 after catching the exception and adding action message i should be able to return to the
same page. Also, and this interceptor is applied to different actions i should be able to
return  result corresponding to that particular action.  

Not sure how to do this.

> Ability to catch service layer exceptions at one place and allow adding action messages/errors
before results are rendered
> --------------------------------------------------------------------------------------------------------------------------
>
>                 Key: WW-4234
>                 URL: https://issues.apache.org/jira/browse/WW-4234
>             Project: Struts 2
>          Issue Type: Improvement
>    Affects Versions: 2.3.15.3
>            Reporter: Shailesh Arvind Vaishampayan
>            Priority: Minor
>             Fix For: 2.3.x
>
>
> I am working with an application involoving Struts2 in web layer and Spring in business
layer. I also have BusinessException class which will be used by all business services to
create business related validation failures which must go up to web layer and should be show
to users as validation message. I can easily do this by writing in my Action class:
> {code:java}
>       ClientAction extends ActionSupport throws Exception{
>          ....
>         try{
>             clientService.searchClient();
>         }catch(InvalidClientSearchCriteriaException e){
>               addActionMessage("Invlid Search Criteria");
>         }
>         ...
> {code}
> And similar code in every action class. However i dont want to pollute my action classes
with try catch blocks. Instead it would be much better if i can write on try catch block at
one place and catch all the exceptions there as BusinessExceptions and create messages /errors
from embedded messages/errors in those exceptions. One approach i could think of was to use
interceptor or preResultListener. But I cannot use interceptor like below which catches business
exceptions thrown from action classes...
> {code:java}
>     ExceptionInterceptor extends AbstractInterceptor(ActionInvocation ivocation,...){
             
>           try{
>                     invocation.invoke();
>           }catch(Exception e){
>               if(e instanceof BusinessException){
>                    ActionSupport as = (ActionSupport)invocation.getAction();
>                    String message = extractMessagefromException()//--custom method to
extract message embedded in exception.  
>                as.addActionMessages(message);
>       //-- above will not work result has already been rendered right? and hence it wouldn't
matter if i add actoinmessages now.
>            }
>          }                                               
>    } 
> {code}
> Second approach of of preResultListener is to add action messages just like above in
preResultListener's method as result is yet to be rendered and i can safely change that. However
not sure if preResultListener will ever execute if exception is thrown in action? and even
if it does how i can get the exception object thrown by the action.?
> There has to be something out of the box so that actions are not cluttered with try-catch
blocks



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Mime
View raw message