自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataObject {
boolean required() default true;
}
自定义解析器
import com.alibaba.fastjson.JSONObject;
import com.nuts.pangudatastatistic.common.annotation.DataObject;
import org.apache.commons.io.IOUtils;
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;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
@Component
public class RequestModelArgumentResolver implements HandlerMethodArgumentResolver {
private static final String JSON_REQUEST_BODY = "JSON_REQUEST_BODY";
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(DataObject.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
String body = getJsonBody(nativeWebRequest);
if(body.isEmpty()) {
body = "{}";
}
JSONObject jsonBody = JSONObject.parseObject(body);
return jsonBody.toJavaObject(methodParameter.getParameterType());
}
private static String getJsonBody(NativeWebRequest nativeWebRequest) {
String body = (String) nativeWebRequest.getAttribute(JSON_REQUEST_BODY, NativeWebRequest.SCOPE_REQUEST);
if(body != null) {
return body;
}
try {
BufferedReader reader = nativeWebRequest.getNativeRequest(HttpServletRequest.class).getReader();
body = IOUtils.toString(reader);
nativeWebRequest.setAttribute(JSON_REQUEST_BODY, body, NativeWebRequest.SCOPE_REQUEST);
} catch (IOException e) {
return "";
}
return body;
}
}
配置自定义解析器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Autowired
private RequestModelArgumentResolver requestModelArgumentResolver;
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(requestModelArgumentResolver);
}
}