SpringBoot调用Controller

本文介绍了IndexController类,它使用SpringMVC框架处理HTTP请求,包括/index和/call路由。重点展示了如何获取RequestMappingHandlerAdapter,解析请求参数并调用相应的处理方法。
摘要由CSDN通过智能技术生成
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");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值