@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface JsonParser {
}
public class JsonArgsParser extends AbstractNamedValueMethodArgumentResolver {
private static final String UNIQUE = UUID.randomUUID().toString();
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getMethodAnnotation(JsonParser.class) != null;
}
@Override
protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
return new NamedValueInfo("", false, null);
}
@Override
protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest webReq) throws Exception {
Object paramsOk = webReq.getAttribute(UNIQUE, RequestAttributes.SCOPE_REQUEST);
if (paramsOk == null) {
HttpServletRequest request = webReq.getNativeRequest(HttpServletRequest.class);
String body = StreamUtils.copyToString(request.getInputStream(), Charset.forName("UTF-8"));
JSONObject jsonObject = JSON.parseObject(body);
for (String key : jsonObject.keySet()) {
webReq.setAttribute(key, jsonObject.getString(key), RequestAttributes.SCOPE_REQUEST);
}
webReq.setAttribute(UNIQUE, new Object(), RequestAttributes.SCOPE_REQUEST);
}
return webReq.getAttribute(name, RequestAttributes.SCOPE_REQUEST);
}
}