spring-boot web項目經常使用配置

一.對用戶輸入query參數過濾空字符串

使用 WebBindingInitializer 來對string類型參數進行過濾,可是這種方式只能處理query參數不能處理body參數web

代碼例子:json

/**
 * 處理String類型的請求參數,若是是空字符串則轉爲null,不然頭尾去空
 * 若是是Body,這種方式處理不了
 *
 * @create: 2018-11-08 17:10
 **/
@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解析實體類中字符串屬性的首尾空格
 * @Date 下午6:06 2018/11/27
 **/
@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參數解密爲例進行說明:app

1.自定義註解   @IdDecryptide

/**
 * @create: 2018-11-06 14:23
 **/

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

    String value() default "AES";
}

2. 自定義參數解析spa

/**
 * 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;
    }
}

3. 在配置WebMvcConfig中添加自定義的ArgumentResolver(也就是上面的IdDecryptResolver)code

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
......

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
//添加自定義Resolver
        argumentResolvers.add(new IdDecryptResolver());
        super.addArgumentResolvers(argumentResolvers);
    }
}

 

4. 在參數上添加該註解orm

@GetMapping("/info")
    public ApiData info(@IdDecrypt Long id) {
        LOGGER.info("Controller.info", "id:{}", id);
        return newApiData();
    }

 

 

四.自定義日期參數轉換

1.我這邊碰到的日期轉換是 時間戳 -> 日期類型 ,so個人配置是這樣的blog

@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); } }
相關文章
相關標籤/搜索