You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Mark Li <xi...@gmail.com> on 2010/06/23 18:56:01 UTC

Ajax Error Handler problem

Hi everyone, 

There is any solution for Ajax Error Handler? the "org.apache.myfaces.ERROR_HANDLER" seems dont work.


The following is my temp solution:

I hack the code about ajax exception handler. because I try the error handler extension, it doesnot work for ajax. and I cant find out any extension point either.

there is my code:
org.apache.myfaces.renderkit.ErrorPageWriter
{
.....
public static void handleThrowable(FacesContext facesContext, Throwable ex) throws FacesException
{
...

if(!ajaxErrorHandlerInited){
  	try {
     		String ajaxErrorHandlerString = facesContext.getExternalContext().getInitParameter("org.apache.myfaces.AJAX_ERROR_HANDLER");
		if(ajaxErrorHandlerString != null){
			Class<?> handler = ErrorPageWriter.class.getClassLoader().loadClass(ajaxErrorHandlerString);
			ajaxErrorHandler = handler.newInstance();
			ajaxErrorHandlerMethod = ajaxErrorHandler.getClass().getMethod("handleException", FacesContext.class, 	
		}
	} catch (Throwable e) {
		e.printStackTrace();
	} finally{
		ajaxErrorHandlerInited = true;
	}
}

if(ajaxErrorHandler != null){
	try {
		String message = (String) ajaxErrorHandlerMethod.invoke(ajaxErrorHandler, facesContext, ex);
		partialWriter.write(message);
	} catch (Throwable e) {
		e.printStackTrace();
		if(ex.getCause() == null)
			partialWriter.write(ex.getCause().toString());
		else
			partialWriter.write(ex.getMessage());
	}	
}else{
	if (ex.getCause() != null)
	{
		partialWriter.write(ex.getCause().toString());
	}
	else
	{
		partialWriter.write(ex.getMessage());
	}
}

...
}
.....

}

you can see I define a new "org.apache.myfaces.AJAX_ERROR_HANDLER" parameter for myfaces. myfaces or specification should have this feature.

Best Regard

Mark 


Error handling in case of PPR was Re: Ajax Error Handler problem

Posted by Werner Punz <we...@gmail.com>.
Ah ok, sorry it was a tad late...

I personally agree, such a parameter would make sense,
it definitely would be nice to route the errors thrown into an error tag
in case of ajax instead of just pushing it up the server,

you might drop a note in the devs list for that or even provide a patch 
in the issue tracker.

I am not even sure if we need such a parameter it might be even better 
just to default it to <changes><error> in the case of being in a ppr 
request, I am going to forward this to the devs list.


Werner



Am 24.06.10 07:42, schrieb Mark Li:
> Hi werner, i know the<error>  protocol, but i mean i want to handle the error in the server side, Like converter the specific exception to a certain message or convert to other exception. Then the message will be  transferred via<error>  to client side.
>
> this is a littler difference with the other topic about "How can I notice if there are facesmessages via ajax".
>
>
> On Jun 24, 2010, at 5:10 AM, Werner Punz wrote:
>
>> Hia mark since you are directly on the response writer anyway, look at the ajax protocol it has an<error>  part where you can drag in errors which are pushed into the ajax error listener queue automatically:
>>
>> <partial-response>
>> <error>
>> <error-name>...</error-name>
>> <error-message>...</error-message>
>> </error>
>> </partial-response>
>>
>> thats how it looks the error then is issued and an error listener is triggered.
>> The partialResponseWriter should have a startError element afair.
>>
>>
>> Werner
>>
>>
>>
>> Am 23.06.10 18:56, schrieb Mark Li:
>>> Hi everyone,
>>>
>>> There is any solution for Ajax Error Handler? the "org.apache.myfaces.ERROR_HANDLER" seems dont work.
>>>
>>>
>>> The following is my temp solution:
>>>
>>> I hack the code about ajax exception handler. because I try the error handler extension, it doesnot work for ajax. and I cant find out any extension point either.
>>>
>>> there is my code:
>>> org.apache.myfaces.renderkit.ErrorPageWriter
>>> {
>>> .....
>>> public static void handleThrowable(FacesContext facesContext, Throwable ex) throws FacesException
>>> {
>>> ...
>>>
>>> if(!ajaxErrorHandlerInited){
>>>    	try {
>>>       		String ajaxErrorHandlerString = facesContext.getExternalContext().getInitParameter("org.apache.myfaces.AJAX_ERROR_HANDLER");
>>> 		if(ajaxErrorHandlerString != null){
>>> 			Class<?>   handler = ErrorPageWriter.class.getClassLoader().loadClass(ajaxErrorHandlerString);
>>> 			ajaxErrorHandler = handler.newInstance();
>>> 			ajaxErrorHandlerMethod = ajaxErrorHandler.getClass().getMethod("handleException", FacesContext.class, 	
>>> 		}
>>> 	} catch (Throwable e) {
>>> 		e.printStackTrace();
>>> 	} finally{
>>> 		ajaxErrorHandlerInited = true;
>>> 	}
>>> }
>>>
>>> if(ajaxErrorHandler != null){
>>> 	try {
>>> 		String message = (String) ajaxErrorHandlerMethod.invoke(ajaxErrorHandler, facesContext, ex);
>>> 		partialWriter.write(message);
>>> 	} catch (Throwable e) {
>>> 		e.printStackTrace();
>>> 		if(ex.getCause() == null)
>>> 			partialWriter.write(ex.getCause().toString());
>>> 		else
>>> 			partialWriter.write(ex.getMessage());
>>> 	}	
>>> }else{
>>> 	if (ex.getCause() != null)
>>> 	{
>>> 		partialWriter.write(ex.getCause().toString());
>>> 	}
>>> 	else
>>> 	{
>>> 		partialWriter.write(ex.getMessage());
>>> 	}
>>> }
>>>
>>> ...
>>> }
>>> .....
>>>
>>> }
>>>
>>> you can see I define a new "org.apache.myfaces.AJAX_ERROR_HANDLER" parameter for myfaces. myfaces or specification should have this feature.
>>>
>>> Best Regard
>>>
>>> Mark
>>>
>>>
>>
>>
>
>



Re: Ajax Error Handler problem

Posted by Mark Li <xi...@gmail.com>.
Hi werner, i know the <error> protocol, but i mean i want to handle the error in the server side, Like converter the specific exception to a certain message or convert to other exception. Then the message will be  transferred via <error> to client side.

this is a littler difference with the other topic about "How can I notice if there are facesmessages via ajax". 


On Jun 24, 2010, at 5:10 AM, Werner Punz wrote:

> Hia mark since you are directly on the response writer anyway, look at the ajax protocol it has an <error> part where you can drag in errors which are pushed into the ajax error listener queue automatically:
> 
> <partial-response>
> <error>
> <error-name>...</error-name>
> <error-message>...</error-message>
> </error>
> </partial-response>
> 
> thats how it looks the error then is issued and an error listener is triggered.
> The partialResponseWriter should have a startError element afair.
> 
> 
> Werner
> 
> 
> 
> Am 23.06.10 18:56, schrieb Mark Li:
>> Hi everyone,
>> 
>> There is any solution for Ajax Error Handler? the "org.apache.myfaces.ERROR_HANDLER" seems dont work.
>> 
>> 
>> The following is my temp solution:
>> 
>> I hack the code about ajax exception handler. because I try the error handler extension, it doesnot work for ajax. and I cant find out any extension point either.
>> 
>> there is my code:
>> org.apache.myfaces.renderkit.ErrorPageWriter
>> {
>> .....
>> public static void handleThrowable(FacesContext facesContext, Throwable ex) throws FacesException
>> {
>> ...
>> 
>> if(!ajaxErrorHandlerInited){
>>   	try {
>>      		String ajaxErrorHandlerString = facesContext.getExternalContext().getInitParameter("org.apache.myfaces.AJAX_ERROR_HANDLER");
>> 		if(ajaxErrorHandlerString != null){
>> 			Class<?>  handler = ErrorPageWriter.class.getClassLoader().loadClass(ajaxErrorHandlerString);
>> 			ajaxErrorHandler = handler.newInstance();
>> 			ajaxErrorHandlerMethod = ajaxErrorHandler.getClass().getMethod("handleException", FacesContext.class, 	
>> 		}
>> 	} catch (Throwable e) {
>> 		e.printStackTrace();
>> 	} finally{
>> 		ajaxErrorHandlerInited = true;
>> 	}
>> }
>> 
>> if(ajaxErrorHandler != null){
>> 	try {
>> 		String message = (String) ajaxErrorHandlerMethod.invoke(ajaxErrorHandler, facesContext, ex);
>> 		partialWriter.write(message);
>> 	} catch (Throwable e) {
>> 		e.printStackTrace();
>> 		if(ex.getCause() == null)
>> 			partialWriter.write(ex.getCause().toString());
>> 		else
>> 			partialWriter.write(ex.getMessage());
>> 	}	
>> }else{
>> 	if (ex.getCause() != null)
>> 	{
>> 		partialWriter.write(ex.getCause().toString());
>> 	}
>> 	else
>> 	{
>> 		partialWriter.write(ex.getMessage());
>> 	}
>> }
>> 
>> ...
>> }
>> .....
>> 
>> }
>> 
>> you can see I define a new "org.apache.myfaces.AJAX_ERROR_HANDLER" parameter for myfaces. myfaces or specification should have this feature.
>> 
>> Best Regard
>> 
>> Mark
>> 
>> 
> 
> 


Re: Ajax Error Handler problem

Posted by Werner Punz <we...@gmail.com>.
Slight correction, the protocol part looks like following exactly

<partial-response>
....

<error>
  <error-name>...</error-name>
  <error-message><![CDATA[]]></error-message>
</error>

....
</partial-response>

what happens is if you issue that:

the response gets an error directive -> the javascripts drag the error 
into the error listener queue -> the queue does whatever it does with 
the errors (in case of the latest myfaces scripts from the trunk showing 
an alert dialog under development mode ignoring it under production 
unless you have your own listener set)


Werner




Am 23.06.10 23:10, schrieb Werner Punz:
> Hia mark since you are directly on the response writer anyway, look at
> the ajax protocol it has an <error> part where you can drag in errors
> which are pushed into the ajax error listener queue automatically:
>
> <partial-response>
> <error>
> <error-name>...</error-name>
> <error-message>...</error-message>
> </error>
> </partial-response>
>
> thats how it looks the error then is issued and an error listener is
> triggered.
> The partialResponseWriter should have a startError element afair.
>
>
> Werner
>
>
>
> Am 23.06.10 18:56, schrieb Mark Li:
>> Hi everyone,
>>
>> There is any solution for Ajax Error Handler? the
>> "org.apache.myfaces.ERROR_HANDLER" seems dont work.
>>
>>
>> The following is my temp solution:
>>
>> I hack the code about ajax exception handler. because I try the error
>> handler extension, it doesnot work for ajax. and I cant find out any
>> extension point either.
>>
>> there is my code:
>> org.apache.myfaces.renderkit.ErrorPageWriter
>> {
>> .....
>> public static void handleThrowable(FacesContext facesContext,
>> Throwable ex) throws FacesException
>> {
>> ...
>>
>> if(!ajaxErrorHandlerInited){
>> try {
>> String ajaxErrorHandlerString =
>> facesContext.getExternalContext().getInitParameter("org.apache.myfaces.AJAX_ERROR_HANDLER");
>>
>> if(ajaxErrorHandlerString != null){
>> Class<?> handler =
>> ErrorPageWriter.class.getClassLoader().loadClass(ajaxErrorHandlerString);
>> ajaxErrorHandler = handler.newInstance();
>> ajaxErrorHandlerMethod =
>> ajaxErrorHandler.getClass().getMethod("handleException",
>> FacesContext.class,
>> }
>> } catch (Throwable e) {
>> e.printStackTrace();
>> } finally{
>> ajaxErrorHandlerInited = true;
>> }
>> }
>>
>> if(ajaxErrorHandler != null){
>> try {
>> String message = (String)
>> ajaxErrorHandlerMethod.invoke(ajaxErrorHandler, facesContext, ex);
>> partialWriter.write(message);
>> } catch (Throwable e) {
>> e.printStackTrace();
>> if(ex.getCause() == null)
>> partialWriter.write(ex.getCause().toString());
>> else
>> partialWriter.write(ex.getMessage());
>> }
>> }else{
>> if (ex.getCause() != null)
>> {
>> partialWriter.write(ex.getCause().toString());
>> }
>> else
>> {
>> partialWriter.write(ex.getMessage());
>> }
>> }
>>
>> ...
>> }
>> .....
>>
>> }
>>
>> you can see I define a new "org.apache.myfaces.AJAX_ERROR_HANDLER"
>> parameter for myfaces. myfaces or specification should have this feature.
>>
>> Best Regard
>>
>> Mark
>>
>>
>
>
>



Re: Ajax Error Handler problem

Posted by Werner Punz <we...@gmail.com>.
Hia mark since you are directly on the response writer anyway, look at 
the ajax protocol it has an <error> part where you can drag in errors 
which are pushed into the ajax error listener queue automatically:

<partial-response>
<error>
<error-name>...</error-name>
<error-message>...</error-message>
</error>
</partial-response>

thats how it looks the error then is issued and an error listener is 
triggered.
The partialResponseWriter should have a startError element afair.


Werner



Am 23.06.10 18:56, schrieb Mark Li:
> Hi everyone,
>
> There is any solution for Ajax Error Handler? the "org.apache.myfaces.ERROR_HANDLER" seems dont work.
>
>
> The following is my temp solution:
>
> I hack the code about ajax exception handler. because I try the error handler extension, it doesnot work for ajax. and I cant find out any extension point either.
>
> there is my code:
> org.apache.myfaces.renderkit.ErrorPageWriter
> {
> .....
> public static void handleThrowable(FacesContext facesContext, Throwable ex) throws FacesException
> {
> ...
>
> if(!ajaxErrorHandlerInited){
>    	try {
>       		String ajaxErrorHandlerString = facesContext.getExternalContext().getInitParameter("org.apache.myfaces.AJAX_ERROR_HANDLER");
> 		if(ajaxErrorHandlerString != null){
> 			Class<?>  handler = ErrorPageWriter.class.getClassLoader().loadClass(ajaxErrorHandlerString);
> 			ajaxErrorHandler = handler.newInstance();
> 			ajaxErrorHandlerMethod = ajaxErrorHandler.getClass().getMethod("handleException", FacesContext.class, 	
> 		}
> 	} catch (Throwable e) {
> 		e.printStackTrace();
> 	} finally{
> 		ajaxErrorHandlerInited = true;
> 	}
> }
>
> if(ajaxErrorHandler != null){
> 	try {
> 		String message = (String) ajaxErrorHandlerMethod.invoke(ajaxErrorHandler, facesContext, ex);
> 		partialWriter.write(message);
> 	} catch (Throwable e) {
> 		e.printStackTrace();
> 		if(ex.getCause() == null)
> 			partialWriter.write(ex.getCause().toString());
> 		else
> 			partialWriter.write(ex.getMessage());
> 	}	
> }else{
> 	if (ex.getCause() != null)
> 	{
> 		partialWriter.write(ex.getCause().toString());
> 	}
> 	else
> 	{
> 		partialWriter.write(ex.getMessage());
> 	}
> }
>
> ...
> }
> .....
>
> }
>
> you can see I define a new "org.apache.myfaces.AJAX_ERROR_HANDLER" parameter for myfaces. myfaces or specification should have this feature.
>
> Best Regard
>
> Mark
>
>