我们知道,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缓存中的数据,可以将参数获取与参数来源解耦,同时参加校验空值等行为。
网友评论