使用参数拦截器通过注解直接从JSON对象中获取数据

场景:当前段传过来的对象是JSON对象,当时我们使用的时候又是仅仅使用其中的部分字段值的时候,可以通过实现参数拦截器来为我们自动将JSON中的key值赋值给参数

代码

1.自定义注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonParam {
    String value() default "";
}

2.实现参数拦截器

public class JsonPathArgumentResolver implements HandlerMethodArgumentResolver {

    private static final String JSON_REQUEST_BODY="JSON_REQUEST_BODY";

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(JsonParam.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        String paramName= Optional.ofNullable(methodParameter.getParameterAnnotation(JsonParam.class).value()).filter(StringUtils::isNotBlank).orElse(methodParameter.getParameterName()).toString();
        return JSONPath.read(getRequestBody(nativeWebRequest),paramName);
    }

    private String getRequestBody(NativeWebRequest webRequest){
        HttpServletRequest servletRequest=webRequest.getNativeRequest(HttpServletRequest.class);
        String jsonBody=(String)servletRequest.getAttribute(JSON_REQUEST_BODY);
        if(jsonBody==null){
            try{
                jsonBody= IOUtils.toString(servletRequest.getInputStream());
                servletRequest.setAttribute(JSON_REQUEST_BODY,jsonBody);
            }catch (IOException e){
                throw new RuntimeException(e);
            }
        }
        return jsonBody;
    }
}

3.注册参数拦截器

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List argumentResolvers) {
        argumentResolvers.add(new JsonPathArgumentResolver());
        super.addArgumentResolvers(argumentResolvers);
    }
}
4.编写测试controller

@Controller
@RequestMapping("h1")
public class TestController {

    @RequestMapping(value = "h2")
    public @ResponseBody Object testHeaderContext(@RequestParam("sex") int sex, @JsonParam int age, @JsonParam String name) {
        return "sex="+sex+" age="+age+"name="+name;
    }
}



你可能感兴趣的:(使用参数拦截器通过注解直接从JSON对象中获取数据)