Hi,

We need to return custom error code and error message when exception occurs
during REST invocation. We have created a exception mapper provider, it
works well for the exceptions from the application code. However, it doesn't
work when exception occurs from the CXF code (e.g. JAXRSInInterceptor).

For example, if I use an invalid request url (e.g no matched path or
method), WebApplicationException is thrown by
JAXRSInInterceptor.processRequest() method.  In this case, we need to return
a custom error code and error message in JSON format, but it doesn't work
even though we have a  exception mapper provider created to handle
WebApplicationException. 


Is there any way to handle exceptions from cxf interceptors and return
response to user with something like the following? 

{
      result: {
          code: "E2002"
          message: "Invalid Request"
      }
}



Here is the code snippet for our exception mapper provider and it works for
the exception from application code.

Code Snippet
========================
public Response toResponse(Exception exception) {
                Response response = null;
                StdRuntimeException rootCause = null;
        
                if (exception instanceof StdRuntimeException) {
                        rootCause = (StdRuntimeException) exception;
                }
                else if (exception.getCause() != null && exception.getCause() 
instanceof
StdRuntimeException) {
                        rootCause = (StdRuntimeException) exception.getCause();
                } 
                //for WebApplicationException thrown in API implementation
                else if (exception instanceof WebApplicationException) {
                        response = 
((WebApplicationException)exception).getResponse();
                } 
                
                if (rootCause != null) {
                        String errorCode = null;
                        String errorMessage = null;
                        ErrorHandler  errorHandler = (ErrorHandler)
BeanFactory.getBeanInstance(AppConstants.BEAN_WSMT_ERROR_HANDLER);
                        try {
                                StdErrorMessageAdapter messageAdapter = 
(StdErrorMessageAdapter)
errorHandler.handleException(rootCause);
                                Map errorDetails = 
messageAdapter.getErrorDetails();
                                for (Map.Entry<String, List<String>> me : 
((Map<String, List<String>>)
errorDetails).entrySet()) {
                                        String key = me.getKey();
                                        if 
(key.equals(AppConstants.PARAM_CODE)) {
                                                errorCode = 
me.getValue().get(0);
                                        } else if 
(key.equals(AppConstants.PARAM_MSG)) {
                                                errorMessage = 
me.getValue().get(0);
                                        }
                                }
                }catch (Exception e) {
                        log.debug("Exception during handling the exception. 
This should
not happen", e);
                }
                
                        Error error = new Error();
                        error.setCode(errorCode);
                        error.setMessage(errorMessage);
                        
                        ResponseBuilder rb =
Response.status(Response.Status.INTERNAL_SERVER_ERROR);
                        rb.type(MediaType.APPLICATION_JSON);
                        rb.entity(error);
                        response = rb.build();
                }
                return response;
        }

Thanks in advance,

Li


-- 
View this message in context: 
http://www.nabble.com/How-to-handle-exception-from-cxf-interceptors--tp25514049p25514049.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to