HandlerMethodArgumentResolver的简单使用

相关api:

 

作用:

  1. SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上。
  2. 自定义一个参数解析器需要实现HandlerMethodArgumentResolver接口,重写supportsParameterresolveArgument方法,配置文件中加入resolver配置。
  3. 如果需要多个解析器同时生效需要在一个解析器中对其他解析器做兼容。

 由来:

        如果前端对某个不要入参做了加密操作,后端接收到该参数后,都需要进行解密操作。

        针对这种需求,首先想到的是filter或者interceptor实现,但是由于HttpServletRequest对象本身是不提供setParameter()方法的,因此想要修改request中的参数值为decode后的值是不易达到的。

        SpringMVC的HandlerMethodArgumentResolver,解析器;其功能就是解析request请求参数并绑定数据到Controller的入参上。

 

实现一个极其简单的参数解析器

具体如何自定义一个参数解析器呢?

其实很简单,一句话——实现HandlerMethodArgumentResolver接口,重写supportsParameterresolveArgument方法,配置文件中加入resolver配置。

示例代码如下:

自定义注解

 
  1. /**

  2. * @copyright: Copyright (c) hotel.jd.com All Rights Reserved

  3. * @file: Open.java project: trip-hotel-ebooking

  4. * @creator: feng

  5. * @date: 2018

  6. */

  7. package com.demo.resolver;

  8.  
  9. import java.lang.annotation.ElementType;

  10. import java.lang.annotation.Retention;

  11. import java.lang.annotation.RetentionPolicy;

  12. import java.lang.annotation.Target;

  13.  
  14. /**

  15. * /**

  16. *

  17. * @description:

  18. * @author: feng

  19. * @requireNo:

  20. * @createdate: 2018

  21. * @lastdate:

  22. */

  23. @Retention(RetentionPolicy.RUNTIME)

  24. @Target(ElementType.PARAMETER)

  25. public @interface Open {

  26. String name() default "";

  27. }

自定义解析器实现

 
  1. public class MyArgumentsResolver implements HandlerMethodArgumentResolver {

  2. /**

  3. * 解析器是否支持当前参数

  4. */

  5. @Override

  6. public boolean supportsParameter(MethodParameter parameter) {

  7. // 指定参数如果被应用MyParam注解,则使用该解析器。

  8. // 如果直接返回true,则代表将此解析器用于所有参数

  9. return parameter.hasParameterAnnotation(Open.class);

  10. }

  11. /**

  12. * 将request中的请求参数解析到当前Controller参数上

  13. * @param parameter 需要被解析的Controller参数,此参数必须首先传给{@link #supportsParameter}并返回true

  14. * @param mavContainer 当前request的ModelAndViewContainer

  15. * @param webRequest 当前request

  16. * @param binderFactory 生成{@link WebDataBinder}实例的工厂

  17. * @return 解析后的Controller参数

  18. */

  19. @Override

  20. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,

  21. NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

  22.  
  23. return null;

  24. }

  25. }

在springmvc配置解析器

 
  1. <mvc:annotation-driven>

  2. <mvc:message-converters>

  3. <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>

  4. <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>

  5. <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>

  6. <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>

  7. <bean id="fastJsonHttpMessageConverter"

  8. class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4">

  9. <!--加入支持的媒体类型,返回contentType-->

  10. <property name="supportedMediaTypes">

  11. <list>

  12. <value>text/html;charset=UTF-8</value>

  13. <value>application/json;charset=UTF-8</value>

  14. </list>

  15. </property>

  16. </bean>

  17. </mvc:message-converters>

  18. <!--参数转换器-->

  19. <mvc:argument-resolvers>

  20. <bean class="com.jd.trip.hotel.ebooking.resolver.OpenIdHandlerMethodArgumentResolver"/>

  21. </mvc:argument-resolvers>

  22. </mvc:annotation-driven>

具体代码实现:

 
  1. /**

  2. * @copyright: Copyright (c) hotel.jd.com All Rights Reserved

  3. * @file: OpenIdHandlerMethodArgumentResolver.java project: trip-hotel-ebooking

  4. * @creator: feng

  5. * @date: 2018

  6. */

  7. package com.demo.resolver;

  8.  
  9. import org.slf4j.Logger;

  10. import org.slf4j.LoggerFactory;

  11. import org.springframework.core.MethodParameter;

  12. import org.springframework.util.Base64Utils;

  13. import org.springframework.web.bind.support.WebDataBinderFactory;

  14. import org.springframework.web.context.request.NativeWebRequest;

  15. import org.springframework.web.method.support.HandlerMethodArgumentResolver;

  16. import org.springframework.web.method.support.ModelAndViewContainer;

  17.  
  18. import javax.servlet.http.HttpServletRequest;

  19.  
  20. /**

  21. * /**

  22. *

  23. * @description:

  24. * @author: feng

  25. * @requireNo:

  26. * @createdate: 2018

  27. * @lastdate:

  28. */

  29. public class OpenIdHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

  30. private static final Logger LOGGER = LoggerFactory.getLogger(OpenIdHandlerMethodArgumentResolver.class);

  31.  
  32. @Override

  33. public boolean supportsParameter(MethodParameter parameter) {

  34. return parameter.hasParameterAnnotation(Open.class);

  35. }

  36.  
  37. @Override

  38. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

  39. LOGGER.info("OpenIdHandlerMethodArgumentResolver:parameter.getParameterType():{}", parameter.getParameterType());

  40. if (parameter.getParameterType().equals(String.class)) {

  41. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);

  42. String open = request.getHeader("open");

  43. LOGGER.info("OpenIdHandlerMethodArgumentResolver:openid:{}", open);

  44. String string = new String(Base64Utils.decode(open.getBytes()));

  45. LOGGER.info("OpenIdHandlerMethodArgumentResolver:string:{}", string);

  46. return string;

  47. }

  48. return null;

  49. }

  50. }

controller中代码:

 
  1.  
  2. @RequestMapping(value = "getAccountByOpen")

  3. @ResponseBody

  4.  
  5. public String getAccountByOpenId(@Open String open) {

  6. return open;

  7. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值