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

com.sc.utils.web.annotation.handler.RequestJsonHandlerMethodArgumentResolver Maven / Gradle / Ivy

The newest version!
package com.sc.utils.web.annotation.handler;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.sc.utils.web.MediaTypes;
import com.sc.utils.utils.Reflections;
import com.sc.utils.web.annotation.RequestJsonParam;
import com.sc.utils.web.wapper.RequestBodyThreadLocalInterceptor;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;

public class RequestJsonHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver
{
    private static Logger  logger= LoggerFactory.getLogger(RequestJsonHandlerMethodArgumentResolver.class);


    @Override
    public boolean supportsParameter(MethodParameter parameter)
    {
        return parameter.hasParameterAnnotation(RequestJsonParam.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception
    {
        RequestJsonParam requestJsonParam = parameter.getParameterAnnotation(RequestJsonParam.class);

        final HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);

        String requestBody=  getRequestBody(servletRequest.getInputStream());
        
        if (!servletRequest.getContentType().contains(MediaTypes.JSON) || StringUtils.isBlank(requestBody)) {
            logger.error("请求类型错误或者RequestBody为空");
            return null;
        }

        
        if(requestJsonParam.current()){
            if (Collection.class.isAssignableFrom(parameter.getParameterType()))
            {
                
                Class clazz= Reflections.getClassGenricType(parameter.getGenericParameterType());
                return JSON.parseArray(requestBody,clazz);
            }
            return JSON.parseObject(requestBody, parameter.getParameterType());
        }

        String aliasName=getAlias(requestJsonParam,parameter);
        
        if ( Long.class.isAssignableFrom(parameter.getParameterType())){
            return  JSON.parseObject(requestBody).getLong(aliasName);
        }else if (String.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getString(aliasName);
        }else if (Integer.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getInteger(aliasName);
        }else if (Boolean.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getBoolean(aliasName);
        }else if (Byte.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getByte(aliasName);
        }else if (Short.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getShort(aliasName);
        }else if (Double.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getDouble(aliasName);
        }else if (Float.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getFloat(aliasName);
        }else if (BigDecimal.class.isAssignableFrom(parameter.getParameterType())){
            return JSON.parseObject(requestBody).getBigDecimal(aliasName);
        }else if (Collection.class.isAssignableFrom(parameter.getParameterType())){
            
            Class clazz= Reflections.getClassGenricType(parameter.getGenericParameterType());
            String jsonArray=JSON.parseObject(requestBody).getString(aliasName);
            return JSONArray.parseArray(jsonArray,clazz);
        }else {
            String innerParam=JSON.parseObject(requestBody).getString(aliasName);
            if (Collection.class.isAssignableFrom(parameter.getParameterType()))
            {
                
                Class clazz= Reflections.getClassGenricType(parameter.getGenericParameterType());
                return JSON.parseArray(innerParam,clazz);
            }
            return JSON.parseObject(innerParam, parameter.getParameterType());
        }
    }

    
    private String getRequestBody(InputStream inputStream) throws IOException
    {
        String requestBody= RequestBodyThreadLocalInterceptor.RequestBodyThreadLocal.get();
        if(StringUtils.isBlank(requestBody)){
            requestBody=StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8);
            RequestBodyThreadLocalInterceptor.RequestBodyThreadLocal.set(requestBody);
        }
        return requestBody;
    }

    
    private String getAlias(RequestJsonParam requestJsonParam, MethodParameter parameter)
    {
        String alias = requestJsonParam.value();
        if (StringUtils.isBlank(alias))
        {
            alias = parameter.getParameterName();
        }
        return alias;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy