Handling Java Exceptions in Flex application

We can invoke Java objects using BlazeDS. For details on how to invoke Java objects from flex visit this URL Invoking Java methods from Flex

It’s a common practice in Java methods to throw Exceptions to indicate that something has failed. These exceptions can be either custom exceptions or inbuilt exceptions. It is also common that we include some message in that exception, which describes the problem caused. Now how do we get that message and display it in Flex applications? What if you want to add some other information to the Exception you are throwing and you want to access that information too?

You can do this🙂

BlazeDS will by default serialize any Throwable type object. All you need to do is to access the objects.

Accessing the Throwable object in Flex

RemoteObject component invokes the fault event when an error occurs while remote method invocation. The fault event handler is provided with the FaultEvent object. This FaultEvent object has property named message of type mx.messaging.messages.ErrorMessage. The message property holds the Throwable object from the Java method in the rootCause property. We need to use this rootCause property to retrieve the properties which are set to the Throwable object in Java. All the public properties from the Throwable object are available.

We will see a sample application. In this application I am creating a custom Exception and adding a getter method to that, which will return my custom data. From the Flex application I will access both the error message and the custom data.

MyException.java

public class MyException extends Exception {

public MyException(String message) {

super(message);

}

public String getMyName(){

return “Sujit Reddy G”;

}

}

Method throwing exception

This method will throw the custom exception created above, add this method to a Java class. Invoke the below method using RemoteObject component in Flex.

public void throwCheckedException() throws Exception{

throw new MyException(“This is a checked exception”);

}

Reading values in Flex application

We add the method below as the fault event handler to the RemoteObject component in the Flex application. You can see that we accessed the rootCause object to retrieve the properties of the custom Exception object returned from the Java method.

private function handleException(event:FaultEvent):void{

var errorMessage:ErrorMessage = event.message as ErrorMessage;

Alert.show(errorMessage.rootCause.message);

Alert.show(errorMessage.rootCause.myName);

}

We are adding the above method as fault event handler to the RemoteObject component.

<mx:RemoteObject id=”exceptionObj” destination=”CreatingRpc” result=”handleRPC(event)”

fault=”handleException(event)”/>

Invoking the method in the Java class on button click

<mx:Button label=”Invoke Exception” click=”exceptionObj.throwCheckedException()”/>

You can also use the flex.messaging.MessageException. This class is packaged in the flex-messaging-core.jar. You should throw MessagException instead of MyException or any custom exception created. MessageException provides a property named extendedData, which is a HashMap. You can add any data to this property and access it from the Flex application using ErrorMessage(event.message).extendedData.

That’s it🙂 let me know if you have problem implementing this🙂

39 Responses to Handling Java Exceptions in Flex application

  1. Lyrgard says:

    Thanks a lot, it was just what I was searching for !

  2. Eric says:

    I’ve tried to use your code to catch the authentication errors. At the server side, I’ve set the auth-method to Custom (for Tomcat authentication). And when I pass the wrong credentials from my flex code I was hoping to handle the exception. But I was not able to get the faultString in the Flex application.

    private function handleException(event:FaultEvent):void
    {

    // var errorMessage:ErrorMessage = event.message as ErrorMessage;
    //Alert.show(errorMessage.rootCause.message);
    // Alert.show(errorMessage.rootCause.myName);

    Alert.show(“Error Happened “);
    Alert.show((ErrorMessage)(event.message).extendedData.faultString);
    }

    For the second Alert.show I get
    TypeError: Error #1009: Cannot access a property or method of a null object reference.

    Here’s my tomcat console output. The ClientID is the only part I was able to access from my Flex front end so far.

    [BlazeDS] 11:28:13.906 [DEBUG] Serializing AMF/HTTP response
    Version: 3
    (Message #0 targetURI=/2/onStatus, responseURI=)
    (Typed Object #0 ‘flex.messaging.messages.ErrorMessage’)
    headers = (Object #1)
    rootCause = null
    body = null
    correlationId = “2F1126D7-5658-BE40-E27C-7B43F3C5DCDD”
    faultDetail = null
    faultString = “Login required before authorization can proceed.”
    clientId = “C4F0E77C-3208-ECDD-1497-B8D070884830”
    timeToLive = 0.0
    destination = “books”
    timestamp = 1.204658893906E12
    extendedData = null
    faultCode = “Client.Authentication”
    messageId = “C4F0E77C-321E-6FCE-E17D-D9F1C16600A8”

  3. Sujit Reddy G says:

    Hi Eric,
    Modify your code to the below one

    Alert.show(event.message.faultString)

    faultString is a property of the ErrorMessage, not the extendedData.

    Hope this helps.

  4. Eric says:

    Sujit,
    Yes it helped, thanks; posted code snippet was from my fault event handler, so I had to change it to
    Alert.show(event.fault.faultString);

    I have another question now; it is not directly related with this thread but I’ll shoot it;

    I have a custom flex user login form. Which calls the setCredential on my remote object. it works the first time, but if in the same session, if I want to switch to another user, the call to
    myRemoteObj.setCredentials(userid,pwd)
    doesn’t work. it returns an exception about it can not re-authenticate. As a workaround I have changed it to
    myRemoteObj.logout();
    myRemoteObj.setCredentials(userid,pwd)
    But this returns a Action Script Error (A popup – looks like a Adobe Flash Player Console)

    Error: Credentials cannot be set while authenticating or logging out.

    My guess is setCredentials code is executed before the logout call is not finished. What can be done ?

  5. Mick says:

    Eric,

    Trying doing channelSet.disconnect() or disconnectAll();

    My question to you is, in a fresh browser window, if a login attempt fails, does you browser present a login prompt for that remoting endpiong? That’s the problem I have right now. I have login form in Flex that calls an authenticate operation on my remote object. However, the remote object requires a login before calling the authenticate method. Weird isn’t it?

    thanks.

  6. Eric says:

    Mick,
    You need to make your remote object which does the authentication public. Otherwise it is catch22. Make sure the remote object is not secured anyway through URL path or other means.

    BTW, channelSet.disconnectAll() did NOT do it for me. I still get the same error when I try to pass the new credentials afterwards
    Error: Credentials cannot be set while authenticating or logging out.

  7. Why can RemoteClass not be used for this?

  8. Sujit Reddy G says:

    You meant to say you want to create a AS class which is of the type Exception class thrown by your Java and map both? I think that will work.🙂

  9. sreekanth says:

    Hi Sujit,

    Thank you for this blog. It helped me lot in understanding exception handling concept.
    I am new to Flex.
    I tried to run the same code what is mentioned in this blog, but I am unable to see either name or any other custom message, I can see only “HTTP Request Error”. If possible could you please send me a detailed code snippet Please.

    If I tried to print the error object, I am getting below message

    (mx.messaging.messages::ErrorMessage)#0
    body = (Object)#1
    clientId = “DirectHTTPChannel0”
    correlationId = “11981C27-5A48-7E75-58F6-2F8F3E8E1430”
    destination = “”
    extendedData = (null)
    faultCode = “Server.Error.Request”
    faultDetail = “Error: [IOErrorEvent type=”ioError” bubbles=false cancelable=false eventPhase=2 text=”Error #2032: Stream Error. URL: http://10.20.14.40:8080/SampleHandler/SampleHandler“]. URL: http://10.20.14.40:8080/SampleHandler/SampleHandler
    faultString = “HTTP request error”
    headers = (Object)#2
    messageId = “701C98FC-8E91-E1A0-F489-2F8F3FC64A65”
    rootCause = (flash.events::IOErrorEvent)#3
    bubbles = false
    cancelable = false
    currentTarget = (flash.net::URLLoader)#4
    bytesLoaded = 0
    bytesTotal = 0
    data = (null)
    dataFormat = “text”
    eventPhase = 2
    target = (flash.net::URLLoader)#4
    text = “Error #2032: Stream Error. URL: http://10.20.14.40:8080/SampleHandler/SampleHandler
    type = “ioError”
    timestamp = 0
    timeToLive = 0

    Thanks for your precious time.

    Awaiting for your reply.

    thank you
    Sreekanth

  10. Julien says:

    Hi, I have tried with suceed to map Java exceptions and AS3 classes with RemoteObject, but now I have to make the same with Java execptions from Web services. I thought it ‘d be possible to cast event.message in ErrorMessage but it doesn’t work.
    Please i need some help.

  11. Sujit Reddy G says:

    Hi Julien,

    I never tried this. I can suggest you to have a look at the URL below and see if you solve your problem.

    http://livedocs.adobe.com/flex/3/langref/mx/rpc/xml/IXMLSchemaInstance.html

    Hope this helps.

  12. Sujit Reddy G says:

    Hi Sreekanth,

    Looks like you did not configure your end point properly. Usually the end point URL for a remoting destination ends with messagingbroker/amf …. The URL http://10.20.14.40:8080/SampleHandler/SampleHandler

    Please check out the URL below and see if you configured the destination properly.

    https://sujitreddyg.wordpress.com/2008/01/14/invoking-java-methods-from-adobe-flex/

    Hope this helps.

  13. Sujit Reddy G says:

    Hi Sreekanth,

    Looks like you did not configure your end point properly. Usually the end point URL for a remoting destination ends with messagingbroker/amf …. The URL http://10.20.14.40:8080/SampleHandler/SampleHandler

    Please check out the URL below and see if you configured the destination properly.

    https://sujitreddyg.wordpress.com/2008/01/14/invoking-java-methods-from-adobe-flex/

    Hope this helps.

  14. Khawar says:

    Hi Sujit,
    I hope you will be fine. I have a problem with a SOAP Service. I invoke a method called getSongsOfContext(applicationID,applicationPass,userID,userPass,contextBlock,duration).

    But i get an error called “[RPC Fault faultString=”HTTP request error” faultCode=”Server.Error.Request” faultDetail=”Error: [IOErrorEvent type=”ioError” bubbles=false cancelable=false eventPhase=2 text=”Error #2032″]. URL: http://webservice.aristomusic.com:10808/production/services/Aristo-WS“]”.

    The ContextBlock parameter of the SOAPService is a LIST on the backend JAVA server. I am initialization it as an Array because Flex help tells me that Array maps to the LIST class of JAVA. But still I get that error.

    Could you please help. This component is very important part of my project. My money is stuck.

    Cheers
    Khawar

  15. Sujit Reddy G says:

    Hi Khawar,

    It doesn’t look like there is a problem with the type conversion.🙂 If you think that is the problem, then please check out if it is a sparse Array or dense Array. Depending on the Array the conversion varies. Please find more details on sparse and dense array and how they affect the conversion at the URL below.

    http://livedocs.adobe.com/flex/3/html/data_access_4.html#202412

    Hope this helps

  16. i create a website which will help people who are interesting in Java. My website is new so it will get better with help of Java users.

  17. mohana says:

    I get error message as follows on using Flex FDS. I guess it is getting null pointer and no error in console and I get this in trace in handleError function

    ErrorMessage : (mx.messaging.messages::ErrorMessage)#0
    body = (null)
    clientId = (null)
    correlationId = “6AF204EA-3614-9028-33B1-99560682484F”
    destination = “swingsService”
    extendedData = (null)
    faultCode = “Server.Processing”
    faultDetail = (null)
    faultString = “java.lang.NullPointerException : null”
    headers = (Object)#1
    messageId = “615B081E-AC4E-EA2B-0958-CE8DC326D0A7”
    rootCause = (Object)#2
    cause = (null)
    localizedMessage = (null)
    message = (null)
    timestamp = 1218048296812
    timeToLive = 0

  18. Sujit Reddy G says:

    Hi Mohana,

    Can you try and debug the rootCause object in the ErrorMessage. Try to find some error in the stdout of the web server.

    Hope this helps.

  19. xavixxxx says:

    Hi,

    Julien, did you managed to map Java exceptions threw by a web service to ActionScript exception ?
    I have the same problem and I would like some help if possible.

    I have a java custom exception which is as followed :

    public class MyException extends Exception {

    public String messageLog;
    public String messageEncoded;

    public MyException () {
    }

    public MyException (String message) {
    super(message);
    }

    Here are the setter/getter of the 2 attributes …
    }

    I have too a MyException in actionScript :

    package MyPackage
    {
    [RemoteClass(alias=”MyPackage.MyException”)]
    [Bindable]
    public class MyException{
    public var messageLog: String;
    public var messageEncoded: String;
    }
    }

    And I d’like to retrieve this exception in the fault method of the flex service.

    private function onFault( event:FaultEvent) : void {

    var myException:MyException = event.fault.rootCause as MyException;

    }

    but, the object myException is always NULL whereas event.fault.rootCause has values in it.

    Do you have an idea to resolve my problem ?

    Thank you for your answers !!
    Bye

  20. Kranthi says:

    Hi Sujit,

    Can you please tell how to do Exception handling for Flex-HTTPServices communication.

    Class on Backend is as below.

    —————————————-
    public class ServiceAcceptor extends javax.servlet.http.HttpServlet {

    private Logger logger=Logger.getLogger(ServiceAcceptor.class);

    public ServiceAcceptor() {
    super();
    }

    public void init(){
    // ClarityAgent.getInstance();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doAction(request,response);

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doAction(request,response);
    }

    protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    IAction action = (IAction)ctx.getBean(“ServicesController”);
    try{
    action.doAction(request,response);
    }catch(Exception e){
    throw new ServletException(“Exception from BackEnd”);
    }

    }
    ———————————-

    On flex side we see the following variables. I dont see the cutom error which I put on backend side.

    ———————————-

    message = mx.messaging.messages.ErrorMessage (@b3e29d1)
    body = Object (@b3ce269)
    clientId = “DirectHTTPChannel0”
    correlationId = “DB42658C-64A1-2618-156A-E11B7AFCE636”
    destination = “”
    extendedData = null
    faultCode = “Server.Error.Request”
    faultDetail = “Error: [IOErrorEvent type=”ioError” bubbles=false cancelable=false eventPhase=2 text=”Error #2032: Stream Error. URL: http://161.15.160.169:7070/ProductWS/services/GetClientReports“]. URL: /ProductWS/services/GetClientReports”
    faultString = “HTTP request error”
    headers = Object (@b3ce179)
    messageId = “B355B8AC-7B18-AC77-5604-E11BA1FDC34A”
    rootCause = flash.events.IOErrorEvent (@b1b83f9)
    bubbles = false
    cancelable = false
    currentTarget = flash.net.URLLoader (@b3e2a81)
    eventPhase = 2
    target = flash.net.URLLoader (@b3e2a81)
    text = “Error #2032: Stream Error. URL: http://161.15.160.169:7070/ProductWS/services/GetClientReports
    type = “ioError”
    timestamp = 0
    timeToLive = 0

    ————————————-

    If you can find solution please let me know.
    Thanks a lot in advance

    Kranthi

  21. elearning says:

    Really thanks alot for these great tutorials!

    Your blog has valuable and great tutorials.

  22. kranthi says:

    Hi Sujit,

    I am working on flex with java as backend and blazeds in the middle.

    I found this doc very useful as this is what i have been looking for,
    but i could not apply this exactly to my project as i don’t want to changed anything in my services, i cannot have my custom exceptions class,

    but i want to get the error message from down the stack,
    i could get the error message from down the stack in java using exception.getCause(),
    can u suggest me a way to get this in flex.

    Thankyou,
    V.Kranthi.

  23. Sujit Reddy G says:

    Hi Kranthi,

    I don’t think you need to create custom exception classes. Even the regular Exception classes thrown are returned to you in Flex.

    Hope this helps.

  24. kranthi says:

    HI Sujit,

    Thankyou for the response,
    you are right, even the regular exception class is throwing some error message,
    i could get the base error with the rootCause object.

    Thankyou,
    Regards,
    V.Kranthi.

  25. […] Flex and Blaze DSBlazeDS and LCDS Feature differenceRendering PDF content in Adobe AIR applicationHandling Java Exceptions in Flex applicationAS3 library for Google Calendar (as3googlecalendarlib)Ask […]

  26. Gerry Christiansen says:

    Very nice example and explanation. I am currently using this in our application project and it works like a champ. Much thanks for taking the time to create this explanation. Saved me many, many hours.

  27. Frankie says:

    I was using your approach succesfully until we have switched using the Flex-Spring Integration.
    After that I can no longer access my custom exception from Flex client, instead server returns a UndeclaredThrowableException just like reported here.
    http://forum.springsource.org/showthread.php?t=72571
    Can you think of a workaround ?

  28. Kammy Wesley says:

    Thanks for this post! Exactly what I needed!

  29. Jashraj Deshpande says:

    Hi sujit

    This exception handling is straight forward when we call a remote object method and add a Fault event listener to it. I have a case which is different.

    details : From flex call a servlet to upload file from flex side. The servlet gets invoked and reads the data , does some processing by calling some helper classes. If any error occurs while processing i throw exception , which indirectly comes out of servlet as ServletException .

    But at flex side we cannot add a fault event listener for uploading file. So how to catch such servlet exceptions….

    Thanks & Regards
    Jash

  30. Rajendra says:

    I want to bring data from 2 different places .. How can I do this.

    it will not accept 2 url and 2 result.

  31. Rajendra says:

    s:HTTPService
    url=”data/www.abc.com/data/”
    url=”http://www.adobetes.com/f4iaw100/remoteData/employees.xml”

  32. Rajendra says:

    s:HTTPService
    url=”data/www.abc.com/data/”
    url=”http://www.adobetes.com/f4iaw100/remoteData/employees.xml .How can I bring data from 2 source when Form is loading

  33. Rajendra says:

    Sujit : Help Needed

    L1
    OPT1

    TID
    20

    TID,TIDAID
    40

    CircuitId
    20

    2010-04-06

    I am getting this xml file thru HTTPService. And after getting I am trying to parse.
    I am getting error like this. Bellow partial code..
    alarmData = event.result.totalAlarms.alarmRecord;
    for each(var emp:Object in alarmData){
    alramObj= new AlarmDetail();
    alramObj.network=emp.network;
    How can I geet and . It will be great If I get one example like display result data from This type of xml file.

  34. Rajendra says:

    totalAlarms
    alarmRecord
    network ” Data” network
    match_detail
    match_detail_record
    Name “data name” Name
    value ” aabbb” value
    match_detail_record
    match_detail
    alarmRecord
    totalAlarm.
    How can I get Name and Value from HttpService Result. Example of This Type of Xml data is good.

  35. Pawan says:

    Hi Sujit,

    Thanks for these really helpful tutorials.
    I have one question related to this tutorial.

    Is it possible to set “message” property of ResultEvent from Java side, like we did for FaultEvent in this tutorial.

    What i want is, to handle the exception at Java-Side with.. say a flag in ResultEvent to identify that the exception had occured.

  36. Pawan says:

    Thanks

  37. Idan says:

    Hi,

    I am using flex4 with blazeds.
    I am trying to use the paging feature.
    I have the following method in the java code:
    public List getData(int start, int end)

    After I use the “Enable paging” the builder change the method getData to receive no arguments.
    When the following line is executing in flex:
    getDataResult.token = kaiServer3.getData();

    I got the below exception.
    Do you know what can cause this ?

    Thanks

    RPC Fault faultString=”java.lang.NullPointerException : null” faultCode=”Server.Processing” faultDetail=”null”]
    at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[E:\dev\4.x\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:345]
    at mx.rpc::Responder/fault()[E:\dev\4.x\frameworks\projects\rpc\src\mx\rpc\Responder.as:68]
    at mx.rpc::AsyncRequest/fault()[E:\dev\4.x\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:113]
    at NetConnectionMessageResponder/statusHandler()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:604]
    at mx.messaging::MessageResponder/status()[E:\dev\4.x\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:264]

  38. anjum shahzad says:

    when i call java serivce,fault method executed and getting null event info object.how can i identify that what exception is thrown…….
    e.g
    function fault(event:Object):void
    {
    var falutEvent:FaultEvent = event as Faultevent;
    //when i print faultEvent it gives null value
    }
    plz reply me
    thanks in advance.

  39. Hi Idan,

    Not sure what is causing this exception. If you can share code to reproduce this, I can try and fix the issue.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: