前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义Controller方法参数解析器

自定义Controller方法参数解析器

作者头像
DH镔
发布2019-12-19 23:24:47
8220
发布2019-12-19 23:24:47
举报

自定义Controller方法参数注入,比如主动注入当前用户等等

核心类:HandlerMethodArgumentResolver

代码语言:javascript
复制
package org.springframework.web.method.support;

import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;

/**
 * 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;

}

这个接口中有两个方法,supportsParameter用于判断是否通过本解析器解析该参数,resolveArgument用于编写解析的逻辑,返回的对象赋值给方法的相对应的参数。

举个例子

代码语言:javascript
复制
import lombok.Data;

/**
 * @author donghaibin
 */
@Data
public class User {

    private String name;

    private String age;
}

一个User对象,现在需要在Controller的一个接口中获取当前请求的User,最直接的方法是在方法体中编写逻辑获取,但这样写不是那么的优雅。另一种方法就是通过HandlerMethodArgumentResolver实现。

代码语言:javascript
复制
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;

/**
 * @author donghaibin
 */
public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        // isAssignableFrom方法判断类型是否为本身或者子类
        return methodParameter.getParameterType().isAssignableFrom(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        // 这里测试直接构建一个对象返回
        User user = new User();
        user.setAge("18");
        user.setName("DHB");
        return user;
    }

}
代码语言:javascript
复制
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author donghaibin
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        // 添加进参数解析器集合
        resolvers.add(new UserArgumentResolver());
    }
}

测试

代码语言:javascript
复制
import cn.dhbin.test.config.User;
import cn.dhbin.test.config.UserFlag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author donghaibin
 */
@RestController
@Slf4j
public class TestController {

    @RequestMapping("/test")
    public String test(String a, User user) {
        log.info(user.toString());
        return a;
    }
}

结果

代码语言:javascript
复制
2019-07-18 23:47:14.535  INFO 44852 --- [nio-8080-exec-1] cn.dhbin.test.controller.TestController  : User(name=DHB, age=11)

总结

通过这个demo大概明白自定义参数解析只需两步

  1. 继承HandlerMethodArgumentResolver编写解析逻辑
  2. 重写WebMvcConfigurer的addArgumentResolvers方法,添加自定义的解析器到参数解析器集合中
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 举个例子
    • 测试
      • 结果
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com