如何基于RESTEasy实现@IsNumeric约束校验器,校验路径参数非数字返回BadRequest
RESTEasy 自定义@IsNumeric数字校验实现
自定义注解定义
首先创建可复用的数字校验注解,支持标注在方法、参数、字段位置,匹配接口层的使用场景:
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = IsNumericValidator.class) @Documented public @interface IsNumeric { // 校验失败时的默认提示信息 String message() default "请求入参必须为纯数字格式"; // 校验分组配置,兼容标准Bean Validation的规范 Class<?>[] groups() default {}; // 校验负载配置,兼容标准Bean Validation的规范 Class<? extends Payload>[] payload() default {}; }
校验逻辑实现
编写对应注解的校验器,完成数字格式的判断逻辑:
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class IsNumericValidator implements ConstraintValidator<IsNumeric, String> { // 数字匹配正则,可根据业务需求调整匹配范围 private static final String NUMERIC_PATTERN = "^-?\\d+$"; @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 按照Bean Validation规范,null值不触发当前校验,可搭配@NotNull注解实现非空校验 if (value == null) { return true; } // 执行匹配逻辑,返回校验结果 return value.matches(NUMERIC_PATTERN); } }
- 仅允许正整数场景:将正则调整为
^\\d+$ - 支持正负小数场景:将正则调整为
^-?\\d+(\\.\\d+)?$
校验异常映射配置
默认RESTEasy在校验不通过时会抛出ConstraintViolationException,需要配置对应的异常映射,将校验失败的响应直接设置为400 BadRequest,和业务返回逻辑解耦:
import javax.validation.ConstraintViolationException; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider public class ValidationExceptionMapper implements ExceptionMapper<ConstraintViolationException> { @Override public Response toResponse(ConstraintViolationException exception) { // 固定返回400状态码,携带校验错误信息 return Response.status(Response.Status.BAD_REQUEST) .entity(exception.getMessage()) .build(); } }
该类添加了@Provider注解,只要在RESTEasy的组件扫描路径下,就会被自动注册为异常处理模块,不需要额外手动配置。
接口使用方式
完成以上配置后,即可在RESTEasy接口中直接使用标注,实现docId的数字校验,不需要在业务代码中手动判断入参格式:
@GET @Path("/{docId}") public SomeThing getSomeThing(@PathParam("docId") @IsNumeric String docId) { return ...; }
上述实现兼容两种标注位置:将@IsNumeric直接打在接口方法上,或是打在PathParam修饰的入参上,都能触发校验逻辑。
前置要求:需确保项目已引入RESTEasy与Bean Validation的集成依赖,容器会自动扫描注册所有校验器和异常映射类,无需手动触发校验流程。
内容的提问来源于stack exchange,提问作者Wojciech Laka
相关产品推荐
相关产品推荐

