54 lines
2.2 KiB
Java
54 lines
2.2 KiB
Java
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");
|
|
}
|
|
}
|