package com.imyeyu.spring.annotation; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import jakarta.annotation.Nonnull; import jakarta.servlet.http.HttpServletRequest; import com.imyeyu.io.IO; import com.imyeyu.java.bean.timi.TimiCode; import com.imyeyu.java.bean.timi.TimiException; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; 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; @Component public class RequestSingleParamResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(RequestSingleParam.class); } @Override public Object resolveArgument(@Nonnull MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); if (request == null) { throw new TimiException(TimiCode.REQUEST_BAD, "request illegal"); } JsonElement element = JsonParser.parseString(IO.toString(request.getInputStream())); if (!element.isJsonObject()) { throw new TimiException(TimiCode.ARG_BAD, "not json object"); } JsonObject object = element.getAsJsonObject(); String parameterName = parameter.getParameterName(); if (!object.has(parameterName)) { throw new TimiException(TimiCode.ARG_MISS, "not found " + parameterName + " param"); } JsonElement el = object.get(parameterName); if (parameter.getParameterType().isAssignableFrom(Long.class)) { return el.getAsLong(); } if (parameter.getParameterType().isAssignableFrom(Integer.class)) { return el.getAsInt(); } if (parameter.getParameterType().isAssignableFrom(String.class)) { return el.getAsString(); } throw new TimiException(TimiCode.ERROR, "not support parameter type"); } }