美文网首页开源框架-SpringBoot系列
springboot controller 自定义参数注入

springboot controller 自定义参数注入

作者: 田文健 | 来源:发表于2019-11-28 20:53 被阅读0次

    我们知道,SpringMVC可以自动把request中的请求参数绑定到@RequestMapping的方法参数上,其实也可以自定义绑定参数。
    一种是参数中的数据需要做一下类型转换,典型的就是日期类型,转换方式如下:

    /**
     * @author tianwenjian
     * @date 2019/11/6
     */
    @Slf4j
    public class DateConverter  implements Converter<String, Date> {
    
        private static final String DATE_FORMAT = "yyyy-MM-dd";
        private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(DATE_FORMAT);
    
        @Override
        public Date convert(String s) {
            if (StringUtils.isBlank(s)){
                return null;
            }else {
                try {
                    return DATE_FORMATTER.parse(s);
                } catch (ParseException e) {
                    log.error("日期转换错误", e);
                    throw new BusinessException("日期格式错误:" + s);
                }
            }
        }
    }
    

    然后在WebMVC配置中:

    /**
         * 添加MVC 参数转换器
         * @param registry
         */
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addConverter(new DateConverter());
        }
    

    另一种是注入参数,比如要把request中attribute的数据注入到参数中:

    
    /**
     * @author tianwenjian
     * @date 2019/11/6
     */
    public class ReqAttrResolver implements HandlerMethodArgumentResolver {
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.getParameterAnnotation(ReqAttribute.class) != null;
        }
    
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    
            String attribute = parameter.getParameterAnnotation(ReqAttribute.class).value();
            HttpServletRequest request =  webRequest.getNativeRequest(HttpServletRequest.class);;
            return request.getAttribute(attribute);
        }
    }
    
    

    配置

    /**
         * 添加 参数绑定器
         * @param resolvers
         */
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
            //注入 request attribute参数
            resolvers.add(new ReqAttrResolver());
        }
    

    注解:

    
    /**
     * @author tianwenjian
     *
     * 当使用这个注解时,自动注入request attribute中的同名参数,省去从request中获取的步骤
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.PARAMETER)
    public @interface ReqAttribute {
    
        /**
         * 参数名称
         * @return
         */
        String value();
    }
    
    

    这样就完成了request中attribute的注入,当然也可以改成注入redis缓存中的数据,可以将参数获取与参数来源解耦,同时参加校验空值等行为。

    相关文章

      网友评论

        本文标题:springboot controller 自定义参数注入

        本文链接:https://www.haomeiwen.com/subject/khfiwctx.html