springboot使用自定义注解注入参数值

需求:使用自定义注解,获得请求头中的字段,映射进入handler参数。

1、自定义注解

package com.example.demo.anno;

import java.lang.annotation.*;

/**
 * @author shi
 * @created 2019/11/28
 */
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
}

2、配置注解的解析器

package com.example.demo.anno;

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 shi
 * @created 2019/11/28
 */
public class InfoHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
	//判定解析的注解,可以配置支持多个注解,这里只配置了一个
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        if(methodParameter.hasParameterAnnotation(Info.class))
            return true;
        return false;
    }

	//处理方法,如果有多个注解要区分开
	//if(parameter.getParameterAnnotation(Info.class) != null)
	//此处逻辑为获得请求header中的channel字段,映射generalRequest中的channel字段
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String channel = request.getHeader("channel");
        GeneralRequest generalRequest = new GeneralRequest();
        generalRequest.setChannel(channel);
        return generalRequest;
    }
}

springmvc的配置

package com.example.demo.anno;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * @author shi
 * @created 2019/11/28
 */
@Configuration
public class InfoConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        super.addArgumentResolvers(argumentResolvers);
        argumentResolvers.add(new InfoHandlerMethodArgumentResolver());
    }
}

测试:

	@RequestMapping("/testInfo")
    public String testInfo(@Info GeneralRequest request){
        logger.info("{}",request.getChannel());
        return "success";
    }

postman

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中,我们可以通过实现 Converter 接口来自定义类型转换器,但是有时候我们发现自定义的转换器并没有生效。这可能是因为 Spring Boot 默认使用的是 GenericConversionService,而不是我们自定义的 ConversionService。 解决这个问题的方法有两种: 1. 在自定义转换器上添加 @Component 注解,将其注册到 Spring 容器中,并在需要使用该转换器的地方使用 @Autowired 注入。这样就可以确保我们自定义的转换器会被使用。 2. 自定义一个 ConversionService,将其注册到 Spring 容器中,并在需要使用该转换器的地方使用 @Qualifier 注解指定使用我们自定义的转换器。这种方法需要手动配置 ConversionService,但是可以更灵活地控制转换器的使用。 下面是第二种方法的示例代码: ```java @Configuration public class ConversionConfig { @Bean public ConversionService conversionService() { DefaultConversionService conversionService = new DefaultConversionService(); // 注册自定义转换器 conversionService.addConverter(new MyConverter()); return conversionService; } } ``` 在需要使用自定义转换器的地方,可以使用 @Qualifier 注解指定使用我们自定义的 ConversionService,例如: ```java @RestController public class DemoController { @Autowired @Qualifier("conversionService") private ConversionService conversionService; @GetMapping("/test") public String test(@RequestParam("myParam") MyParam myParam) { // 使用自定义转换器将字符串转换为自定义类型 MyParam // ... return "success"; } } ``` 希望能帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值