Spring HandlerMethodArgumentResolver接口

介绍

HandlerMethodArgumentResolver是用来为处理器解析参数的,主要用在HandlerMethod中,每个Resolver对应一种类型的参数,其实现类特别的多。

接口定义

  • supportsParameter 用于判断是否支持对某种参数的解析
  • resolveArgument 将请求中的参数值解析为某种对象
public interface HandlerMethodArgumentResolver {

    /**
     * Whether the given {@linkplain MethodParameter method parameter} is
     * supported by this resolver.
     * @param parameter the method parameter to check
     * @return {@code true} if this resolver supports the supplied parameter;
     * {@code false} otherwise
     */
    boolean supportsParameter(MethodParameter parameter);

    /**
     * Resolves a method parameter into an argument value from a given request.
     * A {@link ModelAndViewContainer} provides access to the model for the
     * request. A {@link WebDataBinderFactory} provides a way to create
     * a {@link WebDataBinder} instance when needed for data binding and
     * type conversion purposes.
     * @param parameter the method parameter to resolve. This parameter must
     * have previously been passed to {@link #supportsParameter} which must
     * have returned {@code true}.
     * @param mavContainer the ModelAndViewContainer for the current request
     * @param webRequest the current request
     * @param binderFactory a factory for creating {@link WebDataBinder} instances
     * @return the resolved argument value, or {@code null} if not resolvable
     * @throws Exception in case of errors with the preparation of argument values
     */
    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;

}

例子实现

自定义注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonParam {

    String value();

    boolean required() default true;

    String defaultValue() default "";
}

实现 HandlerMethodArgumentResolver

public class JsonPathArgumentResolver implements HandlerMethodArgumentResolver {

    private static final String JSON_REQUEST_BODY = "JSON_REQUEST_BODY";

    //判断是否支持要转换的参数类型
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(JsonParam.class);
    }

    //当支持后进行相应的转换
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String body = getRequestBody(webRequest);
        Object val = null;

        try {
            val = JsonPath.read(body, parameter.getParameterAnnotation(JsonParam.class).value());
            if (parameter.getParameterAnnotation(JsonParam.class).required() && val == null) {
                throw new ParamCheckException(parameter.getParameterAnnotation(JsonParam.class).value() + "不能为空");
            }
        } catch (PathNotFoundException exception) {
            System.out.println(exception.getStackTrace());
            if (parameter.getParameterAnnotation(JsonParam.class).required()) {
//                throw new ParamCheckException(parameter.getParameterAnnotation(JsonParam.class).value() + "不能为空");
                throw exception;
            }
        }
        return val;
    }

    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;

    }

}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HandlerMethodArgumentResolverSpring框架提供的一个接口,用于解析方法参数。它的作用是将请求中的参数值绑定到方法的参数上,使得方法能够正确地获取到请求中的数据。 HandlerMethodArgumentResolver接口定义了一个方法resolveArgument,该方法用于解析方法参数。具体的解析逻辑由实现了HandlerMethodArgumentResolver接口的类来实现。Spring框架提供了一些默认的实现类,如RequestParamMethodArgumentResolver和PathVariableMethodArgumentResolverRequestParamMethodArgumentResolver用于解析@RequestParam注解修饰的方法参数,它会根据请求中的参数名和方法参数名进行匹配,并将匹配到的参数值绑定到方法参数上。 PathVariableMethodArgumentResolver用于解析@PathVariable注解修饰的方法参数,它会根据请求中的路径变量和方法参数名进行匹配,并将匹配到的路径变量值绑定到方法参数上。 下面是一个使用HandlerMethodArgumentResolver的示例代码: ```java @RestController public class UserController { @GetMapping("/user/{id}") public User getUser(@PathVariable("id") Long id) { // 根据id查询用户信息 User user = userService.getUserById(id); return user; } } ``` 在上述代码中,getUser方法使用了@PathVariable注解修饰的id参数。当请求路径为"/user/123"时,PathVariableMethodArgumentResolver会将路径中的123绑定到id参数上,从而获取到对应的用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值