diff --git a/src/main/java/com/ctrip/zeus/restful/message/impl/ErrorResponseHandler.java b/src/main/java/com/ctrip/zeus/restful/message/impl/ErrorResponseHandler.java index 15530ee1..a653957d 100644 --- a/src/main/java/com/ctrip/zeus/restful/message/impl/ErrorResponseHandler.java +++ b/src/main/java/com/ctrip/zeus/restful/message/impl/ErrorResponseHandler.java @@ -18,8 +18,8 @@ import javax.ws.rs.core.Response; public class ErrorResponseHandler implements ResponseHandler { private static final MediaType defaultMediaType = MediaType.APPLICATION_JSON_TYPE; - public Message generateMessage(Throwable object, String type) throws Exception { - ErrorMessage em = ExceptionUtils.getErrorMessage(object); + public Message generateMessage(Throwable object, String type, boolean printStackTrace) throws Exception { + ErrorMessage em = ExceptionUtils.getErrorMessage(object, printStackTrace); ErrorResponse err = new ErrorResponse(); if (type.equals(MediaType.APPLICATION_XML)) { @@ -29,15 +29,15 @@ public class ErrorResponseHandler implements ResponseHandler { } if (object instanceof NotFoundException) { err.setStatus(Response.Status.NOT_FOUND.getStatusCode()); - }else if (object instanceof BadRequestException) { + } else if (object instanceof BadRequestException) { err.setStatus(Response.Status.BAD_REQUEST.getStatusCode()); - }else if (object instanceof ValidationException) { + } else if (object instanceof ValidationException) { err.setStatus(Response.Status.BAD_REQUEST.getStatusCode()); - }else if (object instanceof ForbiddenException) { + } else if (object instanceof ForbiddenException) { err.setStatus(Response.Status.FORBIDDEN.getStatusCode()); - }else if (object instanceof SlbValidatorException) { + } else if (object instanceof SlbValidatorException) { err.setStatus(506); - }else if (object instanceof Exception) { + } else if (object instanceof Exception) { err.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); } return err; @@ -45,14 +45,17 @@ public class ErrorResponseHandler implements ResponseHandler { @Override 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)) { throw new ValidationException("ErrorResponseHandler only accepts Throwable object"); } - if (mediaType == null || !MediaType.APPLICATION_XML_TYPE.equals(mediaType)) { 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()) .type(mediaType).build(); } diff --git a/src/main/java/com/ctrip/zeus/service/aop/ExceptionAspect.java b/src/main/java/com/ctrip/zeus/service/aop/ExceptionAspect.java index 2ac0fc75..0e6c067a 100644 --- a/src/main/java/com/ctrip/zeus/service/aop/ExceptionAspect.java +++ b/src/main/java/com/ctrip/zeus/service/aop/ExceptionAspect.java @@ -21,7 +21,7 @@ import java.lang.reflect.InvocationTargetException; */ @Aspect @Component -public class ExceptionAspect implements Ordered{ +public class ExceptionAspect implements Ordered { @Resource private ErrorResponseHandler errorResponseHandler; private Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -43,17 +43,23 @@ public class ExceptionAspect implements Ordered{ logger.error(builder.toString()); MediaType mediaType = null; + boolean printStackTrace = false; for (Object arg : point.getArgs()) { if (arg instanceof ContainerRequest) { ContainerRequest cr = (ContainerRequest) arg; mediaType = cr.getMediaType(); + try { + printStackTrace = Boolean.parseBoolean(cr.getHeaderString("slb-stack-trace")); + } catch (Exception ex) { + printStackTrace = false; + } break; } } if (mediaType == null) { 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) { logger.error("Error response handler doesn't work."); return null; diff --git a/src/main/java/com/ctrip/zeus/util/ExceptionUtils.java b/src/main/java/com/ctrip/zeus/util/ExceptionUtils.java index a624600f..2e4c2a36 100644 --- a/src/main/java/com/ctrip/zeus/util/ExceptionUtils.java +++ b/src/main/java/com/ctrip/zeus/util/ExceptionUtils.java @@ -16,15 +16,15 @@ public class ExceptionUtils { public static String getStackTrace(Throwable throwable) { StringBuilder builder = new StringBuilder(); - for(StackTraceElement ste : throwable.getStackTrace()) { + for (StackTraceElement ste : throwable.getStackTrace()) { builder.append(ste.toString() + "\n"); } return builder.toString(); } - public static ErrorMessage getErrorMessage(Throwable throwable) { + public static ErrorMessage getErrorMessage(Throwable throwable, boolean printStackTrace) { return new ErrorMessage().setCode(ExceptionUtils.getErrorCode(throwable)) .setMessage(ExceptionUtils.getMessage(throwable)) - .setStackTrace(ExceptionUtils.getStackTrace(throwable)); + .setStackTrace(printStackTrace ? ExceptionUtils.getStackTrace(throwable) : null); } }