SpringMVC预处理方法参数HandlerMethodArgumentResolver类

在springmvc框架开发中,想要在方法中自动注入一些参数,该怎么做呢?
正好有这么个需求,在json请求过来的时候,想在Controller方法里自动获取json并转换为指定的Bean。
那么就需要用到HandlerMethodArgumentResolver类,这个类可以解析方法中的参数,那么我们可以在解析参数的时候做一些定制化工作。
首先定义一个StringToJsonResolver继承HandlerMethodArgumentResolver,那么需要实现supportsParameter()和resolveArgument()俩个方法,第一个方法是判定参数是否需要处理,需要处理则会调用resolveArgument()方法,resolveArgument()就是具体处理参数的地方。

@Component
public class StringToJsonResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
    //包含AdapterJsonRequestBody注解的参数
        return methodParameter.hasParameterAnnotation(AdapterJsonRequestBody.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        if (!request.getContentType().contains("application/json")) {
            return null;
        }
        BufferedReader reader = request.getReader();
        StringBuilder stringBuilder = new StringBuilder();
        char[] buf = new char[1024];
        int rd;
        while ((rd = reader.read(buf)) != -1) {
            stringBuilder.append(buf, 0, rd);
        }

        JsonBody jsonBody = new JsonBody(stringBuilder.toString());
        return jsonBody;
    }
}

然后要注册这个resolver,需要定义一个WebConfiguration继承自WebMvcConfigurerAdapter类,然后把这个类注册到java container中

public class WebConfiguration extends WebMvcConfigurerAdapter{

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new StringToJsonResolver());
    }
}

注解:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JsonRequestBody {
}


public class JsonBody {
    private Map<String, String> params = new HashMap();

    public String get(String key) {
        return params.get(key);
    }
}

这样在实际调用中就能使用这个@JsonRequestBody注解来获取想要的参数了

public class DemoController {
    public Map<String, Object> index(@JsonRequestBody JsonBody jsonBody) {

    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昂的数字之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值