hide stacktrace

This commit is contained in:
Mengyi Zhou 2015-11-09 15:23:15 +08:00
parent 724ed397a7
commit 07aa454cb5
3 changed files with 23 additions and 14 deletions

View file

@ -18,8 +18,8 @@ import javax.ws.rs.core.Response;
public class ErrorResponseHandler implements ResponseHandler { public class ErrorResponseHandler implements ResponseHandler {
private static final MediaType defaultMediaType = MediaType.APPLICATION_JSON_TYPE; private static final MediaType defaultMediaType = MediaType.APPLICATION_JSON_TYPE;
public Message generateMessage(Throwable object, String type) throws Exception { public Message generateMessage(Throwable object, String type, boolean printStackTrace) throws Exception {
ErrorMessage em = ExceptionUtils.getErrorMessage(object); ErrorMessage em = ExceptionUtils.getErrorMessage(object, printStackTrace);
ErrorResponse err = new ErrorResponse(); ErrorResponse err = new ErrorResponse();
if (type.equals(MediaType.APPLICATION_XML)) { if (type.equals(MediaType.APPLICATION_XML)) {
@ -29,15 +29,15 @@ public class ErrorResponseHandler implements ResponseHandler {
} }
if (object instanceof NotFoundException) { if (object instanceof NotFoundException) {
err.setStatus(Response.Status.NOT_FOUND.getStatusCode()); err.setStatus(Response.Status.NOT_FOUND.getStatusCode());
}else if (object instanceof BadRequestException) { } else if (object instanceof BadRequestException) {
err.setStatus(Response.Status.BAD_REQUEST.getStatusCode()); err.setStatus(Response.Status.BAD_REQUEST.getStatusCode());
}else if (object instanceof ValidationException) { } else if (object instanceof ValidationException) {
err.setStatus(Response.Status.BAD_REQUEST.getStatusCode()); err.setStatus(Response.Status.BAD_REQUEST.getStatusCode());
}else if (object instanceof ForbiddenException) { } else if (object instanceof ForbiddenException) {
err.setStatus(Response.Status.FORBIDDEN.getStatusCode()); err.setStatus(Response.Status.FORBIDDEN.getStatusCode());
}else if (object instanceof SlbValidatorException) { } else if (object instanceof SlbValidatorException) {
err.setStatus(506); err.setStatus(506);
}else if (object instanceof Exception) { } else if (object instanceof Exception) {
err.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); err.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
} }
return err; return err;
@ -45,14 +45,17 @@ public class ErrorResponseHandler implements ResponseHandler {
@Override @Override
public Response handle(Object object, MediaType mediaType) throws Exception { public Response handle(Object object, MediaType mediaType) throws Exception {
return handle(object, mediaType, false);
}
public Response handle(Object object, MediaType mediaType, boolean printStackTrace) throws Exception {
if (object == null || !(object instanceof Throwable)) { if (object == null || !(object instanceof Throwable)) {
throw new ValidationException("ErrorResponseHandler only accepts Throwable object"); throw new ValidationException("ErrorResponseHandler only accepts Throwable object");
} }
if (mediaType == null || !MediaType.APPLICATION_XML_TYPE.equals(mediaType)) { if (mediaType == null || !MediaType.APPLICATION_XML_TYPE.equals(mediaType)) {
mediaType = defaultMediaType; mediaType = defaultMediaType;
} }
Message message = generateMessage((Throwable) object, mediaType.toString()); Message message = generateMessage((Throwable) object, mediaType.toString(), printStackTrace);
return Response.status(message.getStatus()).entity(message.getResponse()) return Response.status(message.getStatus()).entity(message.getResponse())
.type(mediaType).build(); .type(mediaType).build();
} }

View file

@ -21,7 +21,7 @@ import java.lang.reflect.InvocationTargetException;
*/ */
@Aspect @Aspect
@Component @Component
public class ExceptionAspect implements Ordered{ public class ExceptionAspect implements Ordered {
@Resource @Resource
private ErrorResponseHandler errorResponseHandler; private ErrorResponseHandler errorResponseHandler;
private Logger logger = LoggerFactory.getLogger(this.getClass()); private Logger logger = LoggerFactory.getLogger(this.getClass());
@ -43,17 +43,23 @@ public class ExceptionAspect implements Ordered{
logger.error(builder.toString()); logger.error(builder.toString());
MediaType mediaType = null; MediaType mediaType = null;
boolean printStackTrace = false;
for (Object arg : point.getArgs()) { for (Object arg : point.getArgs()) {
if (arg instanceof ContainerRequest) { if (arg instanceof ContainerRequest) {
ContainerRequest cr = (ContainerRequest) arg; ContainerRequest cr = (ContainerRequest) arg;
mediaType = cr.getMediaType(); mediaType = cr.getMediaType();
try {
printStackTrace = Boolean.parseBoolean(cr.getHeaderString("slb-stack-trace"));
} catch (Exception ex) {
printStackTrace = false;
}
break; break;
} }
} }
if (mediaType == null) { if (mediaType == null) {
logger.warn("Request media type cannot be found - use json by default."); logger.warn("Request media type cannot be found - use json by default.");
} }
return errorResponseHandler.handle(cause, mediaType); return errorResponseHandler.handle(cause, mediaType, printStackTrace);
} catch (Exception e) { } catch (Exception e) {
logger.error("Error response handler doesn't work."); logger.error("Error response handler doesn't work.");
return null; return null;

View file

@ -16,15 +16,15 @@ public class ExceptionUtils {
public static String getStackTrace(Throwable throwable) { public static String getStackTrace(Throwable throwable) {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for(StackTraceElement ste : throwable.getStackTrace()) { for (StackTraceElement ste : throwable.getStackTrace()) {
builder.append(ste.toString() + "\n"); builder.append(ste.toString() + "\n");
} }
return builder.toString(); return builder.toString();
} }
public static ErrorMessage getErrorMessage(Throwable throwable) { public static ErrorMessage getErrorMessage(Throwable throwable, boolean printStackTrace) {
return new ErrorMessage().setCode(ExceptionUtils.getErrorCode(throwable)) return new ErrorMessage().setCode(ExceptionUtils.getErrorCode(throwable))
.setMessage(ExceptionUtils.getMessage(throwable)) .setMessage(ExceptionUtils.getMessage(throwable))
.setStackTrace(ExceptionUtils.getStackTrace(throwable)); .setStackTrace(printStackTrace ? ExceptionUtils.getStackTrace(throwable) : null);
} }
} }