package org.lyy.security.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.method.support.HandlerMethodArgumentResolverComposite;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod;
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestDataBinderFactory;
import cn.hutool.extra.spring.SpringUtil;
/**
* IndexController
*
* @since 2022-10-21
*/
@RestController
public class IndexController {
@Autowired
private ApplicationContext applicationContext;
@RequestMapping("/")
public String index() {
return "hello world";
}
@ResponseBody
@RequestMapping("/call")
public Object call() throws Exception {
RequestMappingHandlerAdapter handlerAdapter = SpringUtil.getBean(RequestMappingHandlerAdapter.class);
WebBindingInitializer webBindingInitializer = handlerAdapter.getWebBindingInitializer();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
HandlerMethod handlerMethod = get(request);
ServletInvocableHandlerMethod invocableMethod = new ServletInvocableHandlerMethod(handlerMethod);
HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite();
argumentResolvers.addResolvers(handlerAdapter.getArgumentResolvers());
invocableMethod.setHandlerMethodArgumentResolvers(argumentResolvers);
ServletRequestDataBinderFactory dataBinderFactory = new ServletRequestDataBinderFactory(new ArrayList<>(), webBindingInitializer);
invocableMethod.setDataBinderFactory(dataBinderFactory);
invocableMethod.setParameterNameDiscoverer(new DefaultParameterNameDiscoverer());
HttpServletResponse response = servletRequestAttributes.getResponse();
ServletWebRequest webRequest = new ServletWebRequest(request, response);
Object returnValue = invocableMethod.invokeForRequest(webRequest, new ModelAndViewContainer());
return returnValue;
}
private HandlerMethod get(HttpServletRequest request) {
RequestMappingHandlerMapping mapping =
applicationContext.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
String regex = "\\{(.*?)}";
Pattern patten = Pattern.compile(regex);
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) {
RequestMappingInfo info = entry.getKey();
HandlerMethod method = entry.getValue();
PatternsRequestCondition patternsRequestCondition = info.getPatternsCondition();
Map<String, String> uriTemplateVars = new HashMap<>();
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars);
for (String url : patternsRequestCondition.getPatterns()) {
if (url.equals(request.getParameter("path"))) {
Matcher matcher = patten.matcher(url);
while (matcher.find()) {
String pathVar = matcher.group(NumberUtils.INTEGER_ONE);
uriTemplateVars.put(pathVar, request.getParameter(pathVar));
}
return method.createWithResolvedBean();
}
}
}
throw new IllegalStateException("Not Find HandlerMethod");
}
}
SpringBoot调用Controller
最新推荐文章于 2024-07-06 20:04:14 发布
本文介绍了IndexController类,它使用SpringMVC框架处理HTTP请求,包括/index和/call路由。重点展示了如何获取RequestMappingHandlerAdapter,解析请求参数并调用相应的处理方法。
摘要由CSDN通过智能技术生成