package ameba.mvc; import ameba.exception.ConfigErrorException; import ameba.util.ClassUtils; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.ConstrainedTo; import javax.ws.rs.RuntimeType; import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; import java.util.HashMap; import java.util.Map; /** * 错误处理页面配置 * * @author icode * */ @ConstrainedTo(RuntimeType.SERVER) public class ErrorPageFeature implements Feature { private static final Logger logger = LoggerFactory.getLogger(ErrorPageFeature.class); private static final String GEN_CONF_KEY = "http.error.page.generator"; /** * {@inheritDoc} */ @Override public final boolean configure(FeatureContext featureContext) { HashMap<Integer, String> errorMap = Maps.newHashMap(); Map<String, Object> config = featureContext.getConfiguration().getProperties(); String defaultTemplate = null; String clazz = (String) config.get(GEN_CONF_KEY); Class clz; if (StringUtils.isBlank(clazz)) { clz = ErrorPageGenerator.class; } else { try { clz = ClassUtils.getClass(clazz); } catch (ClassNotFoundException e) { throw new ConfigErrorException(GEN_CONF_KEY + "config error,not found class " + clazz, GEN_CONF_KEY, e); } } for (String key : config.keySet()) { if (StringUtils.isNotBlank(key) && key.startsWith("http.error.page.")) { int startIndex = key.lastIndexOf("."); String statusCodeStr = key.substring(startIndex + 1); if (StringUtils.isNotBlank(statusCodeStr)) { if (statusCodeStr.toLowerCase().equals("default")) { defaultTemplate = (String) config.get(key); defaultTemplate = defaultTemplate.startsWith("/") ? defaultTemplate : "/" + defaultTemplate; } else if (!statusCodeStr.toLowerCase().equals("generator")) { try { String va = (String) config.get(key); int statusCode = Integer.parseInt(statusCodeStr); if (StringUtils.isNotBlank(va)) errorMap.put(statusCode, va.startsWith("/") ? va : "/" + va); } catch (Exception e) { logger.error("parse error status mapping error", e); } } } } } ErrorPageGenerator.setDefaultErrorTemplate(defaultTemplate); ErrorPageGenerator.pushAllErrorMap(errorMap); featureContext.register(clz); return true; } }