( 十七 )、SpringMVC 之 HandlerMethodArgumentResolver 自定义参数解析器

( 十七 )、SpringMVC 之 HandlerMethodArgumentResolver 自定义参数解析器

 

 

1、简介

HandlerMethodArgumentResolver 用于将方法参数解析为参数值的策略接口。源码如下:

public interface HandlerMethodArgumentResolver {

    /**
     * supportsParameter:用于判定是否需要处理该Controller方法的参数,
     *   返回true为需要,并会去调用下面的方法resolveArgument。
     * {@code false} otherwise
     */
    boolean supportsParameter(MethodParameter parameter);

    /**
     * 真正用于处理参数的方法,返回的Object就是controller方法上的形参对象。
     */
    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

 

2、使用示例:

1、自定义 CustomerArgumentResolver

/**
 * @Author dw
 * @ClassName CustomerArgmentResovle
 * @Description
 * @Date 2022/1/9 19:07
 * @Version 1.0
 */
public class CustomerArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return  MyUser.class.isAssignableFrom(methodParameter.getParameterType());
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) throws Exception {
        MyUser myUser = new MyUser();
        myUser.setUserName("王二麻子");
        myUser.setUserAge(29);
        return myUser;
    }
}

 

2、在MvcConfig中 添加自定义的参数解析器:

/**
 * @Author dw
 * @ClassName MvcConfiguration
 * @Description
 * @Date 2022/1/9 19:16
 * @Version 1.0
 */
@Configuration
public class MvcConfiguration implements WebMvcConfigurer {

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

 

3、测试: 

3.1、新建MyUser:

@Data
public class MyUser  {
    private String userName;
    private Integer userAge;
}

 

3.2 新建Controller: 

/**
 * @Author dw
 * @ClassName CustomParamsResolverController
 * @Description
 * @Date 2022/1/9 19:18
 * @Version 1.0
 */
@RestController
public class CustomParamsResolverController {
    
    @RequestMapping("param")
    public MyUser customParam(MyUser myUser){
        System.out.println(myUser.toString());
        return myUser;
    }
}

 

测试结果:

 

posted @ 2022-01-09 20:14  邓维-java  阅读(158)  评论(0)    收藏  举报