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.