ApplicationException.java

package cn.home1.oss.lib.errorhandle.api;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.base.MoreObjects;

import lombok.EqualsAndHashCode;
import lombok.Getter;

import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.util.Map;

/**
 * 应用抛出的通用错误信息.
 *
 * <p>
 * Created by zhanghaolun on 16/7/1.
 * </p>
 */
//@JsonInclude(JsonInclude.Include.NON_EMPTY) // for Jackson 2.x
//@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY) // for Jackson 1.x
//@XmlRootElement(name = "applicationError") // for JAXB
@EqualsAndHashCode(callSuper = false, of = {"status", "template"})
@Getter
public final class ApplicationException extends RuntimeException implements Serializable {

  private static final long serialVersionUID = 1L;

  private static final String APPLICATION_EXCEPTION = "application exception";

  private final HttpStatus status;
  private final String template;
  private final Map<String, Serializable> contextVariables;

  public ApplicationException( //
    final HttpStatus status, //
    final String template, //
    final Map<String, Serializable> contextVariables //
  ) {
    super(APPLICATION_EXCEPTION);
    this.status = checkNotNull(status, "status must not null");
    this.template = checkNotNull(template, "template must not null");
    this.contextVariables = checkNotNull(contextVariables, "contextVariables must not null");
  }

  public static Boolean isApplicationError(final Throwable throwable) {
    return throwable != null && ApplicationException.class.isAssignableFrom(throwable.getClass());
  }

  public Map<String, Serializable> getContextVariables() {
    return this.contextVariables;
  }

  public HttpStatus getStatus() {
    return this.status;
  }

  public String getTemplate() {
    return this.template;
  }

  @Override
  public String toString() {
    final MoreObjects.ToStringHelper toStringHelper = MoreObjects.toStringHelper(ApplicationException.class)
      .add("status", this.status)
      .add("template", this.template);
    if (this.contextVariables != null) {
      this.contextVariables.entrySet().forEach(entry -> toStringHelper.add(entry.getKey(), entry.getValue()));
    }
    return toStringHelper.toString();
  }
}