All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.joe.http.ws.SpringResourceAnalyze Maven / Gradle / Ivy

The newest version!
package com.joe.http.ws;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Stream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import com.joe.utils.common.StringUtils;
import com.joe.utils.type.ReflectUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * 如果参数有自定义对象那么最多有一个非context参数,也就是只能又一个自定义对象,不能有其他参数
 *
 * @author joe
 * @version 2018.08.21 15:53
 */
@Slf4j
public class SpringResourceAnalyze extends ResourceAnalyze {

    SpringResourceAnalyze(Class resourceClass, Object resourceInstance, Method method,
                                 Object[] args) {
        super(resourceClass, resourceInstance, method, args);
    }

    @Override
    public void init() {
        {
            //解析路径
            if (resourceClass.getDeclaredAnnotation(Controller.class) == null) {
                isResource = false;
                return;
            }

            RequestMapping prePath = resourceClass.getDeclaredAnnotation(RequestMapping.class);

            RequestMapping mapping = method.getAnnotation(RequestMapping.class);
            if (mapping == null) {
                isResource = false;
                return;
            }
            isResource = true;

            pathPrefix = prePath == null ? "" : prePath.value()[0];
            log.debug("请求的前缀是:{}", pathPrefix);
            pathLast = mapping.value()[0];
            log.debug("接口名是:{}", pathLast);

            //解析请求方法
            RequestMethod[] methods = mapping.method();
            if (methods.length == 0) {
                resourceMethod = ResourceMethod.POST;
            } else {
                for (RequestMethod method : methods) {
                    if (method == RequestMethod.POST) {
                        resourceMethod = ResourceMethod.POST;
                        break;
                    } else if (method == RequestMethod.PUT) {
                        resourceMethod = ResourceMethod.PUT;
                        break;
                    } else if (method == RequestMethod.DELETE) {
                        resourceMethod = ResourceMethod.DELETE;
                    } else if (method == RequestMethod.GET) {
                        resourceMethod = ResourceMethod.GET;
                    }
                }
            }
        }

        {
            //解析参数
            Parameter[] parameters = method.getParameters();
            int len = parameters.length;
            if (len > 0) {
                ParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
                String[] paramNames = discoverer.getParameterNames(method);
                params = new ResourceParam[len];

                for (int i = 0; i < len; i++) {
                    //参数值
                    Object value = args[i];
                    Parameter parameter = parameters[i];
                    Class parameterType = parameter.getType();

                    //资源参数
                    ResourceParam param = new ResourceParam();
                    param.setParam(value);
                    param.setIndex(i);
                    params[i] = param;

                    PathVariable pathVariable;
                    RequestHeader requestHeader;

                    if (parameter.getDeclaredAnnotation(SessionAttribute.class) != null) {
                        param.setType(ResourceParam.Type.CONTEXT);
                        param.setName(paramNames[i]);
                        continue;
                    } else if ((pathVariable = parameter
                        .getDeclaredAnnotation(PathVariable.class)) != null) {
                        String name = StringUtils.isEmpty(pathVariable.value())
                            ? pathVariable.name()
                            : pathVariable.value();
                        if (StringUtils.isEmpty(name)) {
                            name = paramNames[i];
                        }
                        param.setName(name);
                        param.setType(ResourceParam.Type.PATH);
                    } else if ((requestHeader = parameter
                        .getDeclaredAnnotation(RequestHeader.class)) != null) {
                        String name = StringUtils.isEmpty(requestHeader.value())
                            ? requestHeader.name()
                            : requestHeader.value();
                        if (StringUtils.isEmpty(name)) {
                            name = paramNames[i];
                        }
                        param.setName(name);

                        if (HttpHeaders.class.isAssignableFrom(parameterType)) {
                            param.setType(ResourceParam.Type.CONTEXT);
                        } else {
                            param.setType(ResourceParam.Type.HEADER);
                        }
                    } else {
                        //设置名字
                        RequestParam requestParam = parameter
                            .getDeclaredAnnotation(RequestParam.class);
                        if (requestParam != null) {
                            String name = StringUtils.isEmpty(requestParam.value())
                                ? requestParam.name()
                                : requestParam.value();
                            if (StringUtils.isEmpty(name)) {
                                name = paramNames[i];
                            }
                            param.setName(name);
                        } else {
                            param.setName(paramNames[i]);
                        }

                        //判断类型
                        if (resourceMethod == ResourceMethod.POST) {
                            if (HttpSession.class.isAssignableFrom(parameterType)
                                || HttpServletRequest.class.isAssignableFrom(parameterType)
                                || HttpServletResponse.class.isAssignableFrom(parameterType)) {
                                param.setType(ResourceParam.Type.CONTEXT);
                            } else if (!(Map.class.isAssignableFrom(parameterType))
                                       && !(Collection.class.isAssignableFrom(parameterType))
                                       && ReflectUtil.isSimple(parameterType)) {
                                param.setType(ResourceParam.Type.FORM);
                            } else {
                                param.setType(ResourceParam.Type.JSON);
                            }
                        } else {
                            param.setType(ResourceParam.Type.QUERY);
                        }
                    }
                }
            }
        }

        {
            //如果没有参数那么将请求方法重新设置为GET
            long count = Stream.of(params)
                .filter(param -> !ResourceParam.Type.CONTEXT.equals(param.getType())).count();
            if (count == 0) {
                resourceMethod = ResourceMethod.GET;
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy