一個根據URI定位到spring mvc映射代碼工具類

jopen 10年前發布 | 5K 次閱讀 Java Spring MVC

可以方便是根據URI定位到spring mvc的controller代碼,

@Controller
@RequestMapping("/admin/util")
public class SystemController {
    private static final Logger log = LoggerFactory.getLogger(SystemController .class);

@RequestMapping(value = "/findUriMapMethod.do")
@ResponseBody
public String findUriMapMethod(HttpServletRequest request, HttpServletResponse response) {
    final Env env = EnvUtils.getEnv();
    final String uri = env.param("uri", request.getRequestURI());
    return getHandler(request, uri, "GET");
}

private String getHandler(HttpServletRequest request, final String uri, String method) {
    final Env env = EnvUtils.getEnv();
    final String fMethod = method;
    String[] beanNames = env.getApplicationContext().getBeanNamesForType(RequestMappingHandlerMapping.class);
    log.info("RequestMappingHandlerMapping: {}", Arrays.toString(beanNames));
    HttpServletRequestWrapper httpServletRequestWrapper = new HttpServletRequestWrapper(request) {
        @Override
        public String getRequestURI() {
            /*String paramUri = super.getParameter("uri");
            if(paramUri != null && !"".equals(paramUri.trim())) {
                return paramUri;
            }*/
            return uri;
        }

        @Override
        public StringBuffer getRequestURL() {
            return new StringBuffer(super.getRequestURL().toString()
            .replace(super.getRequestURI(), uri));
        }

        @Override
        public String getServletPath() {
            return super.getServletPath().replace(super.getRequestURI(), uri);
        }

        @Override
        public String getMethod() {
            if(fMethod == null || "".equals(fMethod)) {
                return super.getMethod();
            }
            return fMethod;
        }
    };
    StringBuilder uriMapMethod = new StringBuilder();
    uriMapMethod.append(httpServletRequestWrapper.getRequestURI()).append(": [");
    if(beanNames != null) {
        for(String beanName : beanNames) {
            log.info("beanName: {} ", beanName);
            RequestMappingHandlerMapping mapping = env.getBean(beanName, 
            RequestMappingHandlerMapping.class);
            try {
                HandlerExecutionChain chain = mapping.getHandler(httpServletRequestWrapper);
                if(chain != null) {
                    Object handler = chain.getHandler();
                    System.out.println(handler);
                    if(handler instanceof HandlerMethod) {
                        HandlerMethod hm = (HandlerMethod)handler;
                        log.info("{}:{}", hm.getBeanType().getName(),hm);
                        uriMapMethod.append(hm);
                    } else if(handler instanceof org.springframework.web.servlet.mvc.Controller) {
                        org.springframework.web.servlet.mvc.Controller hm = (org.springframework.web.servlet.mvc.Controller)handler;
                        Class<? extends org.springframework.web.servlet.mvc.Controller> hmClass = hm.getClass();
                        log.info("{}:{}", hmClass.getName(), hmClass.getDeclaredMethod("handleRequest", 
                        HttpServletRequest.class, HttpServletResponse.class));
                        uriMapMethod.append(hmClass.getDeclaredMethod("handleRequest", 
                        HttpServletRequest.class, HttpServletResponse.class));
                    } else {
                        uriMapMethod.append(handler.getClass().getName());
                    }
                    break;
                }
            } catch (HttpRequestMethodNotSupportedException e) {
                 return getHandler(httpServletRequestWrapper, uri, "POST");
            } catch (Exception e) {
                log.error("get uri mapping error.", e); 
            }
            /*Map<RequestMappingInfo, HandlerMethod> mapMethods =  mapping.getHandlerMethods();
            if(mapMethods != null) {
                Iterator<Entry<RequestMappingInfo, HandlerMethod>> iter = mapMethods.entrySet().iterator();
                while (iter.hasNext()) {
                    Entry<RequestMappingInfo, HandlerMethod> entry = iter.next();
                    RequestMappingInfo key = entry.getKey();
                    HandlerMethod hm = (HandlerMethod)entry.getValue();
                    Method method = hm.getMethod();
                    log.info("{} : {}->{}", key.getPatternsCondition(), key, hm);
                }
            }*/
        }
    }
    return uriMapMethod.append("]").toString();
}

}</pre> 來自:http://my.oschina.net/u/565351/blog/372300

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!