spring-boot web项目常用配置

spring-boot web项目常用配置
一.对用户输入query参数过滤空字符串
使用 WebBindingInitializer 来对string类型参数进行过滤,但是这种方式只能处理query参数不能处理body参数

代码例子:

/**
 * 处理String类型的请求参数,如果是空字符串则转为null,否则头尾去空
 * 如果是Body,这种方式处理不了
 *
 **/
@ControllerAdvice
public class StringInitBinder {
    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }

}

二. 自定义Jackson ObjectMapper SimpleModule的扩展来去除@RequestBody解析实体类中字符串属性的首尾空格

/**
 * @Author qinming
 * @Description 自定义Jackson ObjectMapper SimpleModule的扩展来去除@RequestBody解析实体类中字符串属性的首尾空格
 **/
@Component
public class StringTrimModule extends SimpleModule {
    private static final long serialVersionUID = -1269300095841307512L;

    public StringTrimModule() {
        addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) {
            private static final long serialVersionUID = 1252572680057675269L;

            @Override
            public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException {
                return jsonParser.getValueAsString().trim();
            }
        });
    }
}

三.自定义query请求参数解析
自定参数解析,需要先自定义一个注解。以ID参数解密为例进行说明:

1.自定义注解 @IdDecrypt



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

    String value() default "AES";
}
  1. 自定义参数解析
/**
 * ID参数解析
 *
 **/
public class IdDecryptResolver implements HandlerMethodArgumentResolver {
// 判定参数是否支持解析
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(IdDecrypt.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        Object arg = null;
        String[] paramValues = request.getParameterValues(methodParameter.getParameterName());
        if (paramValues != null) {
            arg = (paramValues.length == 1 ? paramValues[0] : paramValues);
        }
//根据参数名称获取WebDataBinder
        WebDataBinder binder = webDataBinderFactory.createBinder(nativeWebRequest, null, methodParameter.getParameterName());
//传入解析后的值,并根据参数类型进行转换
        arg = binder.convertIfNecessary(SerializerUtil.decryptAES(URLDecoder.decode(String.valueOf(arg), "UTF-8")), methodParameter.getParameterType(), methodParameter);
        return arg;
    }
}
  1. 在配置WebMvcConfig中添加自定义的ArgumentResolver(也就是上面的IdDecryptResolver)
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
......

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
//添加自定义Resolver
        argumentResolvers.add(new IdDecryptResolver());
        super.addArgumentResolvers(argumentResolvers);
    }
}
  1. 在参数上添加该注解
@GetMapping("/info")
    public ApiData info(@IdDecrypt Long id) {
        LOGGER.info("Controller.info", "id:{}", id);
        return newApiData();
    }

四.自定义日期参数转换
1.我这边碰到的日期转换是 时间戳 -> 日期类型 ,so我的配置是这样的

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {


   。。。。。。

    /**
     * 时间戳转日期的转换器
     *
     * @param registry
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new Converter<String, Date>() {
            @Override
            public Date convert(String source) {
                if (StringUtils.isNotBlank(source)) {
                    String decode = Codec.decode(source);            //正则判断时间戳参数格式
                    if (Pattern.compile(PatternConstant.TIME_STAMP_PATTERN).matcher(decode).matches()) {
                        return new Date(Long.parseLong(decode));
                    } else {
                       throw new RuntimeException("时间戳格式错误!");
                    }
                }
                return null;
            }
        });
        super.addFormatters(registry);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

princeAladdin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值