在一些put,post请求时候,请求体中可能只有一条键值对。在明确key的前提下,只想获取对应值。使用requestbody去接收参数,会把key一起接收过来,这时候我们还要二次取值去取对应的值,相对比较麻烦、 请求时是“name”:“222”,只想要获取“2222”
使用requestbody接收:
@RequestMapping(value = "/test", method = RequestMethod.PUT)
public String test(@RequestBody String name) {
System.out.println("request:" + name);
return name;
}
不论是使用map或者String接受,如果后续需要这个"222"都要进一步处理
通过自定义注解的方式,实现通过jsonPath获取指定的值
首先创建一个注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface JsonField
{
String value();
}
接着实现HandlerMethodArgumentResolver接口
public class JsonFieldArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(JsonField.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) (webRequest.getNativeRequest());
BufferedReader br = request.getReader();
String str, reqStr = "";
while ((str = br.readLine()) != null) {
reqStr += str;
}
return JSONPath.read(reqStr, "$." + parameter.getParameterAnnotation(JsonField.class).value());
}
}
将请求中的数据进行读取装换成String,通过注解中传递过来的参数(目标值的路径),请求的数据满足json的格式,jsonPath就可以通过路径获取到对应的值并返回对应的结构。
最后,把自己实现的JsonFieldArgumentResolver 加入到spring的配置中
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new JsonFieldArgumentResolver());
WebMvcConfigurer.super.addArgumentResolvers(resolvers);
}
}
这时候,我们再去发起请求
@RequestMapping(value = "/test1", method = RequestMethod.PUT)
public String test1(@JsonField("name") String name) {
System.out.println("request:" + name);
return name;
}
返回的就只有“222”了~
对于多级的json请求也同样可用
@RequestMapping(value = "/test2", method = RequestMethod.PUT)
public ResponseResult test2(@JsonField("catalogueName.name") String name) {
System.out.println("request:" + name);
return new ResponseResult(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMsg(), name);
}
|