HandlerMethodArgumentResolver 参数解析器

关于springMvc中的参数解析器

springMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver(对参数的解析器)

HandlerMethodArgumentResolver接口包含两个接口方法


1

boolean supportsParameter(MethodParameter parameter);

MethodParameter方法参数对象 通过它可以获取该方法参数上的一些信息 如方法参数中的注解信息等

通过该方法我们如果需要对某个参数进行处理  只要此处返回true即可 如对Date类型数据处理的话

   Class  parameterType=parameter.getParameterType();

return parameterType.equals(Date.class);

另一个为


1

2

3

4

Object resolveArgument(MethodParameter parameter,

                           ModelAndViewContainer mavContainer,

                           NativeWebRequest webRequest,

                           WebDataBinderFactory binderFactory) throws Exception;

该方法就是对参数的解析,返回的Object会自动赋值到参数对象中

实例:  自定义一个日期处理注解,通过一个HandlerMethodArgumentResolver来解析

第一步:为HandlerAdapter配置一个自定义的HandlerMethodArgumentResolver


1

2

3

4

5

<mvc:annotation-driven conversion-service="conversionService">

        <mvc:argument-resolvers>

          <bean class="com.car.admin.controller.CustomerHandlerMethodArgumentResolver"></bean>

        </mvc:argument-resolvers>

 </mvc:annotation-driven>

第二步:定义一个日期注解


1

2

3

4

5

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.PARAMETER)

public @interface CustomerDate {

    String value();

}

第三步: 实现HandlerMethodArgumentResolver


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public class CustomerHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    public Object resolveArgument(MethodParameter parameter,

            ModelAndViewContainer mavContainer, NativeWebRequest webRequest,

            WebDataBinderFactory binderFactory) throws Exception {

        Annotation[]  methodAnnotations= parameter.getParameterAnnotations();

        for(Annotation  annotation:methodAnnotations){

            if(annotation instanceof CustomerDate){

                CustomerDate  customerDate=(CustomerDate)annotation;

                String dataStringValue=customerDate.value();

                SimpleDateFormat  formater=new SimpleDateFormat("yyyy-MM-dd HH:mm");

                return  formater.parse(dataStringValue);

            }

        }

        return null;

    }

    @SuppressWarnings("unchecked")

    public boolean supportsParameter(MethodParameter parameter) {

        Class  parameterType=parameter.getParameterType();

        return parameterType.equals(Date.class);

    }

}

第四步: 控制器处理


1

2

3

4

5

6

7

8

9

10

@RequestMapping("/user_list")

    @ResponseBody

    public Map <String,Object> userList(@CustomerDate(value = "2015-02-01 03:55") Date date,HttpServletRequest  request,@PageableDefault(page=0,size=10)  Pageable pageable,Model modelMap) {

        Map<String,String[]>  params=HttpUtils.getParameterValuesMap(request,Constants.SEARCH_PREFIX);

        Page<User>  userPage=userService.findPage(pageable,params);

        Map<String,Object>   results=new  HashMap<String,Object> ();

        results.put("total", userPage.getTotalElements());

        results.put("rows", userPage.getContent());

        return results;

    }      

?

通过上面的处理:     通过CustomerDate 注解 我们可以通过value来制定具体的日期,并且会自动为date赋值,通过此小例子我们可以引申出各种实现

转自 https://www.cnblogs.com/coollijie/p/4244003.html

原文地址:https://www.cnblogs.com/tiancai/p/8427540.html

时间: 2024-10-12 15:37:57

HandlerMethodArgumentResolver 参数解析器的相关文章

SpringMVC自动封装List对象——自定义参数解析器

前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.List]: Specified class is an interface at org.springframework.beans.B

SpringMVC ArgumentREsoler(方法参数解析器)

例: 先创建自定义注解 // @Target(ElementType.PARAMETER) //在运行时生效 //RetentionPolicy.RUNTIME 给方法使用 @Retention(RetentionPolicy.RUNTIME) public @interface CurrentUser { } 去定义自定义注解的规则 package com.lanou.demo.resolvers; import com.lanou.demo.annotation.CurrentUser; i

Spring自定义argumentResolver参数解析器

在一个web程序中,当一个HTTP请求进来时,会被容器处理进而转换成一个servlet请求.http请求所携带的数据,虽然是格式化的但是无类型:而java作为强类型语言,同时为了健壮性考虑,必然要有完善的类型约束.当然,那么,将数据从servlet请求中转换到java中,一个很原始的方式是手动处理.幸好,Spring MVC通过以注解往函数添加额外信息的方式,使得上述的数据转换过程能够交由框架自动处理.从一个角度去看,Controller中的函数声明及注解定义了此HTTP请求的数据格式和类型,也

osg学习笔记2, 命令行参数解析器ArgumentParser

ArgumentParser主要负责命令行参数的读取 #include <osgDB/ReadFile> #include <osgViewer/Viewer> int main(int argc, char **argv) { //命令行参数读取 osg::ArgumentParser arguments(&argc, argv); std::string filename; arguments.read("--model", filename); o

Rails 4.0 移除了 XML 参数解析器。若要使用请加入 actionpack-xml_parser

拜读了用 Rails 搭建微信公众平台 API之后发现, params[:xml]这个办法在Rails 4里面已经被办掉了,于是就看了一下Rails 4的新特性发现XML Parameter parsing has been sent to a plugin. http://www.rubydoc.info/github/rails/actionpack-xml_parser actionpack-xml_parser A XML parameters parser for Action Pac

springmvc 参数解析绑定原理

handlerMethodArgumentResolver:方法参数解析器接口,这个接口是springmvc参数解析绑定的核心接口.不同的参数类型绑定都是通过实行这个接口来实现.也可以通过实现这个接口来自定义参数解析器.这个接口有如下两个方法: public interface HandlerMethodArgumentResolver{ //该解析器是否支持parameter参数的解析 boolean supportsParameter (MethodParameter parameter);

springMVC自定义方法属性解析器

使用场景例子: 用户登陆系统一般会往Session里放置一个VO对象,然后在controller里会来获取用户的userId等信息. 之前的写法是:@SessionAttributes配合@ModelAttribute来进行参数值的注入,但这样需要写2个注解,其中SessionAttributes加在类上,ModelAttribute加在方法的属性上. SpringMVC提供了HandlerMethodArgumentResolver接口来处理我们的自定义参数的解析. 例子: 1.获取用户信息的

【原创】打造属于前端的Uri解析器

今天和大家一起讨论一下如何打造一个属于前端的url参数解析器.如果你是一个Web开发工程师,如果你了解过后端开发语言,譬如:PHP,Java等,那么你对下面的代码应该不会陌生: $kw = $_GET['keyword']; // PHP String kw = request.getParameter("keyword"); // JSP 对于后端语言,通过上面的代码我们可以很方便的获取到一个url请求中的参数值.但是,当我们在一个Web前端工程中需要使用到url参数的时候,我们熟悉

打造属于前端的Uri解析器

今天和大家一起讨论一下如何打造一个属于前端的url参数解析器.如果你是一个Web开发工程师,如果你了解过后端开发语言,譬如:PHP,Java等,那么你对下面的代码应该不会陌生: 1 $kw = $_GET['keyword']; // PHP 2 String kw = request.getParameter("keyword"); // JSP 对于后端语言,通过上面的代码我们可以很方便的获取到一个url请求中的参数值.但是,当我们在一个Web前端工程中需要使用到url参数的时候,