JSR303基础配置与主体配置如何设置,配置步骤有哪些?

JSR 303配置的核心在于引入Hibernate Validator依赖,在Spring容器中注册Validator实例,并配置消息源来定制验证结果。 这是基础配置和主体配置的骨架,其余都是围绕这个骨架展开,无论你是构建REST API还是传统Web应用,掌握这些配置都能让你在参数校验上少走弯路。

JSR 303基础配置怎么配?一步步教你搞定

添加Maven依赖

对于非Spring Boot项目,你需要手动添加Hibernate Validator依赖和Expression Language依赖,典型配置如下:

【JSR303】雷丰阳老师教程 | JSR303数据校验快速入门
加载中
【JSR303】雷丰阳老师教程 | JSR303数据校验快速入门
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.3.Final</version>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b11</version>
</dependency>

如果你使用Spring Boot,只需引入spring-boot-starter-validation,它已经包含了所有必要依赖,包括Hibernate Validator和Tomcat的EL实现。

配置Validator Bean

在Spring配置中,定义一个LocalValidatorFactoryBean,并设置消息源:

@Bean
public LocalValidatorFactoryBean validator() {
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource());
    return bean;
}
@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource ms = 
        new ReloadableResourceBundleMessageSource();
    ms.setBasename("classpath:ValidationMessages");
    ms.setDefaultEncoding("UTF-8");
    return ms;
}

这样,你就完成了基础配置,Spring会自动将ValidationMessages.properties中的消息绑定到验证注解。

XML配置方式

除了Java配置,你也可以使用Spring XML配置:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:ValidationMessages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

JSR303基础配置与主体配置如何设置,配置步骤有哪些?

两种方式效果相同,选择哪种取决于你的项目配置风格。

JSR 303主体配置:分组验证与自定义消息

定义实体约束

主体配置的核心是使用注解定义约束。

public class Product {
    @NotNull(message = "{product.name.notnull}")
    @Size(min = 1, max = 100)
    private String name;
    @DecimalMin(value = "0.01", message = "价格必须大于0")
    private BigDecimal price;
}

这里,消息使用引用外部键,便于国际化。

管理验证消息

在classpath:ValidationMessages.properties中定义:

product.name.notnull=产品名称不能为空
javax.validation.constraints.Size.message={0}长度必须在{min}到{max}之间

对于中文环境,可以创建ValidationMessages_zh_CN.properties,编码为UTF-8,这样,验证器会根据Accept-Language自动切换消息,业内专家指出,这是企业级项目中最常见的配置方式。

分组验证配置

当需要在不同场景下应用不同验证规则时,使用分组。

定义分组接口:

public interface OnCreate {}
public interface OnUpdate {}

在实体上指定分组:

@NotNull(groups = OnCreate.class)
@Null(groups = OnUpdate.class)
private Long id;

Controller中使用@Validated(OnCreate.class):

@PostMapping
public ResponseEntity create(@Validated(OnCreate.class) @RequestBody Product product) {
    // ...
}

分组验证是主体配置中非常实用的技巧,能避免同一个实体在不同接口中重复定义。

跨字段验证

有时需要验证多个字段的组合,比如密码和确认密码一致,可以使用@ScriptAssert或自定义类级别验证。@ScriptAssert示例:

@ScriptAssert(lang = "javascript", script = "_this.password == _this.confirmPassword", message = "密码不一致")
public class User {
    private String password;
    private String confirmPassword;
}

JSR303基础配置与主体配置如何设置,配置步骤有哪些?

注意,@ScriptAssert需要引入JSR 223脚本引擎依赖,更推荐的方式是自定义类级别注解,通过isValid方法获取整个对象进行验证。

进阶配置:自定义注解与整合Spring Boot

实现自定义注解

当内置注解无法满足业务时,自定义注解是扩展验证的最佳方式,设计一个@Phone注解,验证手机号格式。

步骤:

  • 定义注解接口,包含@Constraint(validatedBy = PhoneValidator.class)。
  • 实现ConstraintValidator接口,编写验证逻辑。
  • 在实体上使用@Phone。

代码示例:

@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
    String message() default "手机号格式不正确";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
public class PhoneValidator implements ConstraintValidator<Phone, String> {
    private static final Pattern PHONE_PATTERN = 
        Pattern.compile("^1[3-9]\d{9}$");
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) return true;
        return PHONE_PATTERN.matcher(value).matches();
    }
}

这样,你就拥有了一个可复用的手机号验证注解,自定义注解的开发周期通常不超过半天,但能显著提升代码复用性。

整合Spring Boot自动配置

在Spring Boot中,验证配置更加简化,你只需:

  • 引入spring-boot-starter-validation。
  • 在Controller参数前加@Valid或@Validated。
  • 默认情况下,Spring Boot已经配置了LocalValidatorFactoryBean,消息源默认为ValidationMessages。

如果需要自定义,可以通过application.properties修改消息源路径:

spring.messages.basename=validation/ValidationMessages

或者覆盖Validator Bean,据统计,Spring Boot的自动配置让JSR 303配置几乎零成本。

常见配置对比

JSR303基础配置与主体配置如何设置,配置步骤有哪些?

配置项 基础配置 主体配置
依赖管理 手动添加Hibernate Validator和EL 使用Spring Boot Starter或手动添加
Bean定义 必须手动定义Validator Bean 可依赖自动配置,也可自定义
消息源 通常硬编码在注解中 使用外部Properties文件,支持国际化
分组验证 较少使用 常用,通过@Validated指定分组
自定义注解 较少 灵活扩展,满足业务特化需求

掌握核心,灵活应用

JSR 303配置从基础依赖到主体验证规则,再到消息国际化和分组,构成了一个完整的参数校验体系。 掌握这些,你就能在项目中轻松实现规范、灵活的验证,减少重复代码,提升开发效率。

Q&A:JSR 303配置常见问题

Q1:JSR 303配置和Spring Boot冲突怎么办?

如果Spring Boot自动配置的Validator不满足需求,你可以通过@Primary或@Qualifier指定自定义的Validator Bean,Spring Boot的ValidationAutoConfiguration会检测到自定义配置并后退,你可以直接覆盖LocalValidatorFactoryBean,或使用@Bean定义Validator,在大多数情况下,覆盖Bean即可。

Q2:JSR 303分组验证配置需要改什么?

主要在Controller上使用@Validated注解指定分组,在实体类注解上通过groups属性指定分组,如果需要不同分组使用不同消息,可以在消息文件中使用{javax.validation.constraints.NotNull.message}之类的键,但分组本身不影响消息,只影响验证规则,行业共识认为,分组验证是处理复杂业务场景的利器。

Q3:JSR 303配置中如何实现自定义消息?

在ValidationMessages.properties中定义消息键,格式为约束类名.注解名.message,例如javax.validation.constraints.NotNull.message,然后实体注解中不写message属性,即可自动读取,注意字符编码和文件位置,默认放在classpath根目录下,如果使用Spring Boot,还可以通过spring.messages属性自定义消息文件位置。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/jsr303%e5%9f%ba%e7%a1%80%e9%85%8d%e7%bd%ae%e4%b8%8e%e4%b8%bb%e4%bd%93%e9%85%8d%e7%bd%ae%e5%a6%82%e4%bd%95%e8%ae%be%e7%bd%ae%ef%bc%8c%e9%85%8d%e7%bd%ae%e6%ad%a5%e9%aa%a4%e6%9c%89%e5%93%aa%e4%ba%9b/

赞 (0)
如何将json转为csv格式?,有哪些转换工具?
上一篇 2026年8月1日 11:43
服务器域名究竟在哪买?,注册的域名在哪里查看?
下一篇 2026年8月1日 11:45

相关推荐

  • 做开发的笔记本哪款好?程序员高性价比笔记本电脑推荐

    对于程序员群体而言,一台合格的做开发的笔记本不仅是生产工具,更是延伸大脑的逻辑处理器,核心结论非常明确:开发用笔记本的选购逻辑必须遵循“稳定性大于性能,屏幕素质大于极限跑分,扩展性大于轻薄度”的原则,一台优秀的开发笔记本,必须在编译代码的高负载下保持稳定,在长时间注视下保护视力,且具备应对未来技术栈升级的硬件冗……

    2026年3月29日
    16500
  • 公司网络全瘫痪怎么办?公司网络突然断网怎么快速恢复

    公司网络全瘫痪当深夜的警报声划破办公室的宁静,屏幕上的红色报错代码如同刺眼的伤口,对于任何一家依赖数字化运营的企业而言,这不仅是技术的崩溃,更是业务的停摆,服务器作为企业数字资产的基石,其稳定性直接决定了业务的连续性,在经历了多次因硬件老化、配置不当或供应商服务滞后导致的“网络全瘫痪”事故后,我们深入测试了多款……

    2026年6月28日
    2800
  • iOS开发环境搭建怎么做,Mac怎么搭建iOS开发环境

    搭建高效的iOS开发环境是开启Apple生态开发之旅的基石,核心结论在于:一套完整的iOS开发环境必须由高性能的Mac硬件、官方集成开发环境Xcode以及配套的命令行工具和包管理器共同构成, 只有这三者协同工作,才能确保开发、编译、调试及发布的流畅性,对于开发者而言,掌握ios开发环境搭建 mac的标准流程,不……

    2026年2月25日
    17900
  • 注册公司流程复杂吗?公司注册需要什么材料

    公司注册的基本流程在数字化商业时代,服务器不仅是网站运行的物理载体,更是企业品牌形象与业务稳定性的基石,对于初创企业而言,选择一款性价比高、服务响应快且符合合规要求的服务器,是“公司注册”后落地业务的关键第一步,本文将基于2026年的市场现状,深入测评主流云服务器产品,并结合企业注册初期的实际需求,提供权威的选……

    程序开发 2026年6月29日
    1610
  • asp web开发教程哪里有?初学者如何快速入门

    ASP Web开发的核心在于构建动态、高效且安全的服务器端应用程序,掌握脚本逻辑与数据库交互是精通该技术的关键路径,作为一种成熟的服务器端脚本环境,ASP(Active Server Pages)不仅能够将HTML、脚本命令和组件结合,还能创建交互性极强的动态网页,对于开发者而言,理解其对象模型与生命周期,是构……

    2026年3月15日
    11100
  • 公司网站会被攻击吗?网站被攻击了怎么恢复

    公司网站会被攻击吗在数字化转型的浪潮中,企业网站不仅是展示品牌形象的窗口,更是业务转化的核心阵地,随着网络攻击手段的日益复杂化,“公司网站会被攻击吗”成为了许多企业主和技术负责人心中的疑虑,没有任何网站是绝对安全的,但通过选择具备强大防御能力的服务器基础设施,可以将风险降至最低,本文将从安全架构、防御机制及实际……

    2026年6月23日
    2500
  • 虚拟机需要boot启动吗,虚拟机boot启动项如何设置

    虚拟机需要boot,本质是它和物理机一样要在启动时加载引导程序,只是引导介质从硬盘、光驱变成了虚拟磁盘文件或ISO镜像,没配好boot顺序,虚拟机就会卡在黑屏或提示No bootable device,虚拟机怎么设置boot启动顺序?先把BIOS当总开关虚拟机启动时,会按照固件里设定的顺序寻找可引导设备,顺序靠……

    2026年9月10日
    200
  • 佛山市网站建设公司网站备份怎么做,如何备份网站

    佛山企业在选择网站建设公司时,必须把网站备份方案放在核心考察项,没有明确备份与恢复承诺的建站服务商,本质上是在拿企业数据安全做赌注,为什么网站备份是佛山企业建站的底线网站备份不是“有最好”的功能,而是“必须有”的基础设施,对于佛山本地企业,官网承载着产品展示、客户咨询甚至在线交易,一旦数据丢失,后果远超重建成本……

    2026年8月16日
    1400
  • 小米3开发版本怎么刷机,小米3开发版刷机包下载地址

    小米3开发版本的核心价值在于通过解锁Bootloader并刷入特定固件,实现对底层硬件的完全控制,从而为系统级应用开发、内核调试及性能优化提供纯净的实验环境,针对该机型的程序开发,首要任务是区分硬件架构差异,建立稳定的Fastboot与ADB调试通道,并配置匹配的交叉编译工具链,以下是基于该机型进行深度开发的详……

    2026年2月26日
    15400
  • 如何加快智慧城管建设?智慧城管建设存在哪些难点

    关于加快智慧城管建设的建议随着城市化进程的加速,传统城管模式面临着执法力量不足、响应滞后、数据孤岛等痛点,构建高效、智能的“智慧城管”体系,核心在于底层算力与数据存储的稳定支撑,服务器作为智慧城管系统的“心脏”,其性能直接决定了视频AI识别、大数据分析及实时指挥调度的效率,本文基于真实部署经验,深入测评几款适合……

    2026年5月31日
    3500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注