首先 需要实现框架自带的接口
import com.vqor.core.exception.BusinessException; import com.xtql.food.utils.ValueRangeChecker; import org.apache.commons.lang3.StringUtils; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.math.BigDecimal; /** * 传入参数检查解析器 */ public class ControllerArgumentCheckImpl implements HandlerMethodArgumentResolver { @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer arg1, NativeWebRequest nativeWebRequest, WebDataBinderFactory arg3) throws Exception { ArgumentCheck argumentCheck = methodParameter.getParameterAnnotation(ArgumentCheck.class); String parameterName = methodParameter.getParameterName(); Class<?> parameterClass = methodParameter.getParameterType(); String dataType = argumentCheck.type().length() == 0 ? parameterClass.getName() : argumentCheck.type(); String errMsg = argumentCheck.errMsg(); String data = nativeWebRequest.getParameter(argumentCheck.name().length() == 0 ? parameterName : argumentCheck.name()); if (data != null) { if (!data.matches("\\d+")) { throw new BusinessException("非法参数"); } }else { return new BusinessException("参数不能为空"); } try { ValueRangeChecker.checkValue(data, dataType); return Long.valueOf(data); } catch (IllegalArgumentException e) { throw new BusinessException(errMsg.length() == 0 ? "数字数值越限" : errMsg); } } @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.hasParameterAnnotation(ArgumentCheck.class); } }
我自己写的校验类 和校验方法
import com.vqor.core.exception.BusinessException; import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; /** * 根据传入的参数类型判断参数值是否会整数溢出 * * @author yechendong * @date 2023-1123 */ public class ValueRangeChecker { private static final Map<String, ValueParser> TYPE_PARSERS = new HashMap<>(); static { TYPE_PARSERS.put("java.lang.byte", Byte::parseByte); TYPE_PARSERS.put("java.lang.short", Short::parseShort); TYPE_PARSERS.put("java.lang.int", Integer::parseInt); TYPE_PARSERS.put("java.lang.integer", Integer::parseInt); TYPE_PARSERS.put("java.lang.long", Long::parseLong); TYPE_PARSERS.put("java.lang.float", Float::parseFloat); TYPE_PARSERS.put("java.lang.double", Double::parseDouble); TYPE_PARSERS.put("java.lang.char", s -> s.charAt(0)); TYPE_PARSERS.put("java.lang.boolean", s -> Boolean.parseBoolean(s.toLowerCase())); } public static void checkValue(String value, String type) { ValueParser parser = TYPE_PARSERS.get(type.toLowerCase()); if (parser == null) { throw new IllegalArgumentException("Unsupported type"); } try { parser.parse(value); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid value for " + type + " type"); } } private interface ValueParser { void parse(String value); } }
配置一下
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="customArgumentResolvers"> <bean class="com.ControllerArgumentCheckImpl"/> </property> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="defaultCharset" value="UTF-8"/> <property name="writeAcceptCharset" value="false"/> </bean> </list> </property> </bean>
最后再加上自定义注解
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface ArgumentCheck { String name() default "";//参数名 String type() default "";//参数类型 String errMsg() default "";//检查失败提示文本 }
使用方法 在控制层 在你需要进行整数溢出的参数上进行判断 就能对传入的参数进行校验 也很灵活的 你也可以添加其他注解 校验其他类型
@GetMapping("/select") @ResponseBody public String select(String createDate, String name, @ArgumentCheck(name = "limit",type = "java.lang.Long",errMsg = "类型数值越界") Long limit, Long page )