问题:post请求,只有一两个参数时,不想再定义一个对象进行接收,直接使用String是接收不到的。
1、定义一个注解:@RequestJson
/**
* @author zp
* @date 2022/5/26 9:07
* post请求时前台传来的String类型参数
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestJson {
String value();
}
2、注解的具体实现:
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.framework.annotation.RequestJson;
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;
/**
* @author zp
* @date 2022/5/26 9:14
*/
@Component
public class RequestJsonMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(RequestJson.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
RequestJson requestJson = parameter.getParameterAnnotation(RequestJson.class);
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
BufferedReader reader = request.getReader();
StringBuilder sb = new StringBuilder();
char[] buf = new char[1024];
int rd;
while ((rd = reader.read(buf)) != -1) {
sb.append(buf, 0, rd);
}
JSONObject jsonObject = JSONObject.parseObject(sb.toString());
String value = requestJson.value();
if (jsonObject == null) {
return null;
}
return jsonObject.get(value);
}
}
3、注册到配置文件中去
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private RequestJsonMethodArgumentResolver requestJsonMethodArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(requestJsonMethodArgumentResolver);
}
}
END;
Controller层方法:
@ApiOperation("测试RequestJson注解")
@PostMapping("/test")
public R test(@RequestJson("name")@NotBlank(message = "不能为空") String name, @RequestJson("sex")Integer sex){
return R.ok(name+"----"+sex);
}
参数: