![JAR search and dependency download from the Maven repository](/logo.png)
top.wboost.common.extend.DispatcherServlet Maven / Gradle / Ivy
package top.wboost.common.extend;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import top.wboost.common.base.entity.ResultEntity;
import top.wboost.common.context.SupportXmlWebApplicationContext;
import top.wboost.common.system.code.SystemCode;
import top.wboost.common.system.spring.converter.ParamMethodArgumentResolver;
import top.wboost.common.util.ResponseUtil;
import top.wboost.common.utils.web.utils.HtmlUtil;
import top.wboost.common.utils.web.utils.JSONObjectUtil;
/**
* springmvc servlet 扩展
* @className DispatcherServlet
* @author jwSun
* @date 2017年9月24日 下午7:51:37
* @version 1.0.0
*/
public class DispatcherServlet extends org.springframework.web.servlet.DispatcherServlet {
private static final long serialVersionUID = -2067077725269764849L;
/**
* 404处理
*/
protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setStatus(404);
HtmlUtil.writerJson(response, JSONObjectUtil.toJSONString(ResponseUtil
.codePrompt(ResultEntity.fail(SystemCode.NO_PAGE).setData(request.getRequestURI()).build())));
}
/**扩展功能**/
/**
* 使用自定义扩展上下文环境
*/
public DispatcherServlet() {
setContextClass(SupportXmlWebApplicationContext.class);
}
/**自定义converter生效-begin**/
private List handlerAdapters;
private boolean detectAllHandlerAdapters = true;
protected void initStrategies(ApplicationContext context) {
super.initStrategies(context);
initHandlerAdapters(context);
}
/**
* 初始化handlerAdapters,若有{@link RequestMappingHandlerAdapter}则增加自定义参数解析器
* @param context
*/
protected void initHandlerAdapters(ApplicationContext context) {
this.handlerAdapters = null;
if (this.detectAllHandlerAdapters) {
Map matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context,
HandlerAdapter.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerAdapters = new ArrayList(matchingBeans.values());
AnnotationAwareOrderComparator.sort(this.handlerAdapters);
handlerAdapters.forEach((adapter) -> {
//增加自定义解析转换
if (adapter.getClass() == RequestMappingHandlerAdapter.class) {
RequestMappingHandlerAdapter requestMappingHandlerAdapter = (org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter) adapter;
List resolversAdd = new ArrayList<>();
Map paramMethodArgumentResolver = BeanFactoryUtils
.beansOfTypeIncludingAncestors(context, ParamMethodArgumentResolver.class, true, false);
paramMethodArgumentResolver.forEach((beanName, bean) -> {
resolversAdd.add(bean);
});
requestMappingHandlerAdapter.setCustomArgumentResolvers(resolversAdd);
requestMappingHandlerAdapter.setArgumentResolvers(null);
requestMappingHandlerAdapter.afterPropertiesSet();
}
});
}
} else {
try {
HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);
this.handlerAdapters = Collections.singletonList(ha);
} catch (NoSuchBeanDefinitionException ex) {
// Ignore, we'll add a default HandlerAdapter later.
}
}
// Ensure we have at least some HandlerAdapters, by registering
// default HandlerAdapters if no other adapters are found.
if (this.handlerAdapters == null) {
this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class);
if (logger.isDebugEnabled()) {
logger.debug("No HandlerAdapters found in servlet '" + getServletName() + "': using default");
}
}
}
/**
* 获得处理类
*/
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
for (HandlerAdapter ha : this.handlerAdapters) {
if (logger.isTraceEnabled()) {
logger.trace("Testing handler adapter [" + ha + "]");
}
if (ha.supports(handler)) {
return ha;
}
}
throw new ServletException("No adapter for handler [" + handler
+ "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
/**自定义converter生效-end**/
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy