Spring属性拦截器@InitBinder搭配@RequestBody使用
前言:
Spring属性拦截器@InitBinder搭配@RequestBody使用,导致dto内属性拦截不到的问题。
/** * springMvc的属性编辑器,注:@RequestBody内成员不生效 */ @InitBinder public void initBinder(WebDataBinder binder) throws Exception { binder.registerCustomEditor(Integer.class, new IntegerEditor()); binder.registerCustomEditor(String.class, new StringEditor()); //入参校验统一拦截验证 String className = binder.getObjectName().substring(0, 1).toUpperCase() + binder.getObjectName().substring(1); Class classDto = null; ArrayList<String> dtoPathList = new ArrayList<>(); dtoPathList.add("com.park.test.system.dto."); dtoPathList.add("com.park.test.ucenter.dto."); dtoPathList.add("com.park.test.task.dto."); dtoPathList.add("com.park.test.other.dto."); int i = 0; while (classDto == null) { try { String allClassName = dtoPathList.get(i) + className; classDto = Class.forName(allClassName); } catch (Exception e) { } i++; //防止死循环 if (i > dtoPathList.size()) { break; } } Object entity = binder.getTarget(); for (Field field : ClassUtil.getAllSuperFields(classDto)) { if (field.getGenericType().toString().equals("class java.lang.Integer")) { // 如果类型是Integer field.setAccessible(true); Field file = ClassUtil.getDeclaredSuperField(classDto, field.getName()); file.setAccessible(true); Object value = file.get(entity); log.info("获取到值为{}", value); log.info("spring属性拦截器拦截到入参为Integer类型参数{}值为{}", field.getName(), value); if (!ObjectUtil.isNull(value) && Integer.valueOf(value.toString()) < 0) { throw new ServiceException(2, "参数" + field.getName() + "必须大于0"); } } else if (field.getGenericType().toString().equals("class java.lang.String")) { // 如果类型是String field.setAccessible(true); Field file = classDto.getDeclaredField(field.getName()); file.setAccessible(true); Object value = file.get(entity); log.info("获取到值为{}", value); log.info("spring属性拦截器拦截到入参为String类型参数{}值为{}", field.getName(), value); if (!ObjectUtil.isNull(value) && value.toString().length() >= 2 && value.toString().trim().length() <= 0) { throw new ServiceException(2, "参数" + field.getName() + "不能全为空格"); } } } } private class IntegerEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (!StringUtils.isEmpty(text) && Integer.valueOf(text) < 0) { throw new ServiceException(2, "Integer参数必须大于0"); } setValue(text); return; } } private class StringEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (!StringUtils.isEmpty(text) && text.trim().length() <= 0) { throw new ServiceException(2, "String传入参数不能全为空格"); } setValue(text.trim()); return; } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
从C/C++零基础到月入9K我用了9个月