ExtendedErrorAttributes.java
- package cn.home1.oss.lib.errorhandle.internal;
- import static cn.home1.oss.lib.errorhandle.api.ExceptionResolver.COMPOSITE_EXCEPTION_RESOLVER;
- import com.google.common.collect.ImmutableMap;
- import cn.home1.oss.lib.errorhandle.api.ExceptionResolver;
- import cn.home1.oss.lib.errorhandle.api.ResolvedError;
- import cn.home1.oss.lib.errorhandle.api.ResolvedErrorException;
- import lombok.Setter;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.boot.autoconfigure.web.ErrorAttributes;
- import org.springframework.core.Ordered;
- import org.springframework.core.annotation.Order;
- import org.springframework.web.context.request.RequestAttributes;
- import org.springframework.web.servlet.HandlerExceptionResolver;
- import org.springframework.web.servlet.ModelAndView;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * {@link org.springframework.boot.autoconfigure.web.DefaultErrorAttributes}
- *
- * <p>
- * Created by zhanghaolun on 16/8/9.
- * </p>
- */
- @Order(Ordered.HIGHEST_PRECEDENCE)
- public class ExtendedErrorAttributes //
- implements ErrorAttributes, HandlerExceptionResolver, Ordered {
- private static final String ERROR_ATTRIBUTE = ExtendedErrorAttributes.class.getName() + ".ERROR";
- @Qualifier(COMPOSITE_EXCEPTION_RESOLVER)
- @Autowired
- @Setter
- private ExceptionResolver<Throwable> resolver;
- @Override
- public Map<String, Object> getErrorAttributes( //
- final RequestAttributes requestAttributes, //
- final boolean includeStackTrace //
- ) {
- final Throwable error = getError(requestAttributes);
- final ResolvedError resolved = ResolvedErrorException.isResolvedError(error) ? //
- ((ResolvedErrorException) error).getError() : //
- this.resolver.resolve(requestAttributes, error);
- return resolved != null ? resolved.toErrorAttributes() : ImmutableMap.of();
- }
- @Override
- public int getOrder() {
- return Ordered.HIGHEST_PRECEDENCE;
- }
- @Override
- public ModelAndView resolveException( //
- final HttpServletRequest request, //
- final HttpServletResponse response, //
- final Object handler, //
- final Exception ex //
- ) {
- final ResolvedError resolved = this.resolver.resolve(request, ex);
- this.storeErrorAttributes(request, resolved != null ? new ResolvedErrorException(resolved) : ex);
- return null;
- }
- private void storeErrorAttributes(final HttpServletRequest request, final Exception ex) {
- request.setAttribute(ERROR_ATTRIBUTE, ex);
- }
- @Override
- public Throwable getError(final RequestAttributes requestAttributes) {
- final Throwable found = getAttribute(requestAttributes, ERROR_ATTRIBUTE);
- return found != null ? found : getAttribute(requestAttributes, "javax.servlet.error.exception");
- }
- @SuppressWarnings("unchecked")
- private <T> T getAttribute(final RequestAttributes requestAttributes, final String name) {
- return (T) requestAttributes.getAttribute(name, RequestAttributes.SCOPE_REQUEST);
- }
- }