You need to enable JavaScript to run this app. 如何基于RESTEasy实现@IsNumeric约束校验器,校验路径参数非数字返回BadRequest
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 05:54:08