protected ApplicationContext context;
@Override
public Response toResponse(Throwable t) {
MediaType mediaType = resolveResponseMediaType(t);
ErrorWrapper errorWrapper = (ErrorWrapper) context.getBean(ErrorWrapper.class.getName());
Locale locale = null;
BroadleafRequestContext requestContext = BroadleafRequestContext.getBroadleafRequestContext();
if (requestContext != null) {
locale = requestContext.getJavaLocale();
}
if (t instanceof BroadleafWebServicesException) {
//If this is a BroadleafWebServicesException, then we will build the components of the response from that.
BroadleafWebServicesException blcException = (BroadleafWebServicesException) t;
if (t.getCause() != null) {
LOG.error("An error occured invoking a REST service.", t.getCause());
}
errorWrapper.setHttpStatusCode(blcException.getHttpStatusCode());
if (blcException.getLocale() != null) {
locale = blcException.getLocale();
}
if (locale == null) {
locale = Locale.getDefault();
}
if (blcException.getMessages() != null && !blcException.getMessages().isEmpty()) {
Set<String> keys = blcException.getMessages().keySet();
for (String key : keys) {
ErrorMessageWrapper errorMessageWrapper = (ErrorMessageWrapper) context.getBean(ErrorMessageWrapper.class.getName());
errorMessageWrapper.setMessageKey(resolveClientMessageKey(key));
errorMessageWrapper.setMessage(messageSource.getMessage(key, blcException.getMessages().get(key), key, locale));
errorWrapper.getMessages().add(errorMessageWrapper);
}
} else {
ErrorMessageWrapper errorMessageWrapper = (ErrorMessageWrapper) context.getBean(ErrorMessageWrapper.class.getName());
errorMessageWrapper.setMessageKey(resolveClientMessageKey(BroadleafWebServicesException.UNKNOWN_ERROR));
errorMessageWrapper.setMessage(messageSource.getMessage(BroadleafWebServicesException.UNKNOWN_ERROR, null,
BroadleafWebServicesException.UNKNOWN_ERROR, locale));
errorWrapper.getMessages().add(errorMessageWrapper);
}
} else if (t instanceof WebApplicationException) {
//We will trust that if someone through a WebApplicationException, then they already created the
//response properly.
if (t.getCause() != null) {
LOG.error("An error occured invoking a REST service.", t.getCause());
}
WebApplicationException webAppException = (WebApplicationException) t;
return webAppException.getResponse();
} else {
LOG.error("An error occured invoking a REST service", t);
if (locale == null) {
locale = Locale.getDefault();
}
errorWrapper.setHttpStatusCode(500);
ErrorMessageWrapper errorMessageWrapper = (ErrorMessageWrapper) context.getBean(ErrorMessageWrapper.class.getName());
errorMessageWrapper.setMessageKey(resolveClientMessageKey(BroadleafWebServicesException.UNKNOWN_ERROR));
errorMessageWrapper.setMessage(messageSource.getMessage(BroadleafWebServicesException.UNKNOWN_ERROR, null,
BroadleafWebServicesException.UNKNOWN_ERROR, locale));
errorWrapper.getMessages().add(errorMessageWrapper);
}
return Response.status(resolveResponseStatusCode(t, errorWrapper)).type(mediaType).entity(errorWrapper).build();
}