@Getterpublic class ServiceException extendsRuntimeException {privateHttpStatus status;privateResultCode resultCode;privateObject errorData;privateServiceException(HttpStatus status, ResultCode resultCode, Object errorData){this.status =status;this.resultCode =resultCode;this.errorData =errorData;
}public staticServiceException badRequest(ResultCode resultCode, Object errorData){return newServiceException(HttpStatus.BAD_REQUEST, resultCode, errorData);
}
}
@Getterpublic enumResultCode {//errorCode
SUCCESS(0, "SUCCESS"),
INVALID_PARAMETER(600, "invalid parameter");private final interrorCode;private finalString errorData;
ResultCode(interrorCode, String errorData){this.errorCode =errorCode;this.errorData =errorData;
}
}
@ControllerAdvicepublic classGlobalErrorHandler {
@ExceptionHandler(ServiceException.class)public ResponseEntityhandleServiceException(ServiceException ex){returnResponseEntity
.status(ex.getStatus())
.body(ErrorResponse.failed(ex.getResultCode(), ex.getErrorData()));
}
}
@ApiModel
@Getterpublic class ErrorResponse implementsSerializable {private static final long serialVersionUID = -2254339918462802230L;private final interrorCode;private finalString errorMsg;private finalT errorData;privateErrorResponse(ResultCode resultCode, T errorData) {this.errorCode =resultCode.getErrorCode();this.errorMsg =resultCode.getErrorData();this.errorData =errorData;
}public static ErrorResponsefailed(ResultCode resultCode, T data){return newErrorResponse(resultCode, data);
}
}
@RestControllerpublic classOrderController {
@GetMapping(value= "/v1/orders/{order_id}"/*, produces = {"application/toString", "application/json"}*/)public Order getOrder(@PathVariable("order_id") @NotBlank String orderId){
Order order= newOrder();
BigDecimal total= new BigDecimal(-1.00, new MathContext(2, RoundingMode.HALF_UP));if (total.compareTo(BigDecimal.ZERO) <= 0){throwServiceException.badRequest(ResultCode.INVALID_PARAMETER,"Total is less than zero!");
}
order.setOrderId(orderId);
order.setTotal(total);returnorder;
}
}