美文网首页开源框架-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