当前位置:网站首页>Application and principle of handlermethodargumentresolver
Application and principle of handlermethodargumentresolver
2020-11-07 17:19:00 【LBJ Yu】
HandlerMethodArgumentResolver Policy interface for parsing method parameters to parameter values , What we often call a custom parameter parser , Source code is as follows
/**
* Strategy interface for resolving method parameters into argument values in
* the context of a given request.
*
* @author Arjen Poutsma
* @since 3.1
* @see HandlerMethodReturnValueHandler
*/
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;
}
Here's my little example , It is mainly through the custom parameter parser to change the paging parameters , Extract them and encapsulate them into entity objects
1. First, customize an annotation
/**
* @Author: Yu Yunbo (18088704)
* @Date: 2020/11/7 10:18
* @Description:
*/
@Target(ElementType.PARAMETER)
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomArgumentPage {
}
2. Write a custom parameter parser implementation class
import com.suning.logistics.jwms.on.base.vo.PageBean;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletRequest;
/**
* @Author: Yu Yunbo (18088704)
* @Date: 2020/11/7 10:14
* @Description:
*/
public class CustomArgumentResolvers implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CustomArgumentPage.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
String page = request.getParameter("page");
String pageSize = request.getParameter("pageSize");
PageBean pageBean = new PageBean();
if (StringUtils.isNotEmpty(page)) {
pageBean.setCurrentPage(Integer.valueOf(page).intValue());
}
if (StringUtils.isNotEmpty(pageSize)) {
pageBean.setPageSize(Integer.valueOf(pageSize).intValue());
}
pageBean.setStartPage((pageBean.getCurrentPage()-1)*pageBean.getPageSize());
return pageBean;
}
}
3. Inject a custom parser into IOC in
@Bean
public CustomArgumentResolvers initCustomArgumentResolvers(){
return new CustomArgumentResolvers();
}
4. Will custom parameter parser , Injection into MvcConfigure in
@Configuration
public class WebMvcCustomConfigurer implements WebMvcConfigurer {
@Autowired
private CustomArgumentResolvers customArgumentResolvers;
/**
* Add resolvers to support custom controller method argument types.
* <p>This does not override the built-in support for resolving handler
* method arguments. To customize the built-in support for argument
* resolution, configure {@link RequestMappingHandlerAdapter} directly.
*
* @param resolvers initially an empty list
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(customArgumentResolvers);
}
}
5. Write tests Controller
@RequestMapping("/queryPageConfigList")
@ResponseBody
public Object getWarehouseCodeReadyonly(@CustomArgumentPage PageBean pageBean){
return warehouseConfigService.queryPage(pageBean,null);
}
6. The effect is as follows
The following source code analysis of a wave , Tell me about the whole process ,
1. stay Springboot AutoConfiguration Will automatically inject WebMvcAutoConfiguration
2. stay WebMvcAutoConfiguration in Static inner class EnableWebMvcConfiguration It inherited DelegatingWebMvcConfiguration This class , This is very important , Medium requestMappingHandlerAdapter Method , initialization HandlerAdapter
super.requestMappingHandlerAdapter()
3. In the parent class WebMvcConfigurationSupport in , Here's the picture 565 Line code , Will give HandlerAdapter Set custom parameter parser
4. Get into getArgumentResolvers Method , The core approach addArgumentResolvers
5. It's an empty method ???, Source tracking is into its subclass DelegatingWebMvcConfiguration In this class
6. Continue to code trace the next step , Will arrive WebMvcConfigurerComposite in addArgumentResolvers Method , Cycle WebMvcConfigurer List Call the addArgumentResolvers As for this this.delegates How to initialize , You can study for yourself
7. Finally, it will be transferred to our customized WebMvcCustomConfigurer in , Will our custom parameter parser , Add to the entire parameter resolution List in
8. Analyze the number parameter List Set to HandlerAdapter in
9. When called , The whole call chain is shown in the figure below , Just interested students can analyze it by themselves
版权声明
本文为[LBJ Yu]所创,转载请带上原文链接,感谢
边栏推荐
- How to use Gantt chart layers and filters
- Win7 AppCrash (solution)
- RFID fixed assets management system for fire equipment
- 8.Swarm创建维护和水平扩展Service
- [original] the impact of arm platform memory and cache on the real-time performance of xenomai
- Using LWA and lync to simulate external test edge free single front end environment
- Design of NAND flash interface control
- Knowledge competition of garbage classification
- In 2020, how can wechat seal numbers be quickly lifted?
- Mate 40系列发布 搭载华为运动健康服务带来健康数字生活
猜你喜欢
你真的会使用搜索引擎吗?
Two dimensional code location and alarm system of Expressway
The advantages and functions of psychological counseling app
10000! Ideal car recalls all defective cars: 97 accidents have occurred and losses will be expanded
Exclusive interview with alicloud database of | 2020 PostgreSQL Asia Conference: Wang Xu
[note] error while loading pyv8 binary: exit code 1 solution
QT audio and video development 46 video transmission UDP version
测试攻城狮必备技能点!一文带你解读DevOps下的测试技术
cubemx做stm32 USB开发
深入浅出大前端框架Angular6实战教程(Angular6、node.js、keystonejs、
随机推荐
How to write plug-in code of small program mall system? How to use code to check whether the plug-in is successfully added?
Opencv computer vision learning (10) -- image transform (Fourier transform, high pass filter, low pass filter)
Jenkins pipline stage setting timeout
Knowledge competition of garbage classification
VARCHART XGantt如何在日历上表示工作日
2020-11-06: go, let's talk about the scheduler.
How to solve the problem of blank page in Google Chrome browser
Design pattern of facade and mediator
Stm32f030f4p6 compatible with smart micro mm32f031f4p6
8.Swarm创建维护和水平扩展Service
Microservice - how to limit and fuse service current
Do you really know how to use search engines?
jenkins pipline stage 设置超时
How to optimize the decoding performance of dynamsoft barcode reader
Windows 10 Bluetooth management page 'add Bluetooth or other devices' option click no response solution
Gantt chart grouping activities tutorial
Using rabbitmq to implement distributed transaction
CI / CD of gitlab continuous integrated development environment
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题
嘉宾介绍|2020 PostgreSQL亚洲大会中文分论坛:潘娟