springboot 自定义注解 入参赋值

第一步:自定义注解

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TeacherInfoAnnotation {
}

注解声明方式

通过关键字 @interface 声明为注解

注解的元素类型

主要有 @Target ,@Retention, @Document ,@Inherited 用来修饰注解。

@ Target 表明该注解可以应用的java元素类型。

Target类型 描述
ElementType.TYPE 应用于类、接口(包括注解类型)、枚举
ElementType.FIELD 应用于属性(包括枚举中的常量)
ElementType.METHOD 应用于方法
ElementType.PARAMETER 应用于方法的形参
ElementType.CONSTRUCTOR 应用于构造函数
ElementType.LOCAL_VARIABLE 应用于局部变量
ElementType.ANNOTATION_TYPE 应用于注解类型
ElementType.PACKAGE 应用于包
ElementType.TYPE_PARAMETER 1.8版本新增,应用于类型变量)
ElementType.TYPE_USE 1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)

@Retention: 表明该注解的生命周期

生命周期类型 描述
RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到

@Documented  表明该注解标记的元素可以被Javadoc 或类似的工具文档化。

@Inherited  表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

第二步:创建一个 处理方法参数的解析器

这个类主要是针对于注解标记的参数进行处理

第一个方法如果返回true时,会进入第二个方法

@Component
public class TeacherInfoResover implements HandlerMethodArgumentResolver {
    @Autowired
    private TokenManager tokenManager;
/**
     * 此方法确定当前参数是否需要处理
     * @param methodParameter
     * @return
     */

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        if (methodParameter.hasParameterAnnotation(TeacherInfoAnnotation.class)) {
            return true;
        } else {
            return false;
        }
    }
/**
     * 此方法是对参数的处理结果,返回值将被赋值给handler method的对应参数
     * @param methodParameter
     * @param modelAndViewContainer
     * @param nativeWebRequest
     * @param webDataBinderFactory
     * @return
     * @throws Exception
     */

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        String token = nativeWebRequest.getHeader("token");
        String subject = tokenManager.getTokenClaim(token).getSubject();
        TeacherInfoDTO teacherInfo = JSONUtil.readValue(subject, TeacherInfoDTO.class);
        return teacherInfo;
    }
}

第三步:将我们第二步创建好的参数解析器,添加到spring中


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public TeacherInfoResover teacherInfoResover() {
        return new TeacherInfoResover();
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(teacherInfoResover());
    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半夜燃烧的香烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值