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://test.idctop.com/article/536660.html

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

相关推荐

  • 共赢智慧金融

    【共赢智慧金融】2026年服务器性能深度测评与选购指南在数字化转型进入深水区的2026年,金融级应用对底层基础设施的要求已不再局限于基础的可用性,而是向高并发处理能力、极低延迟响应、数据强一致性以及合规安全性提出了近乎苛刻的标准,作为企业核心业务的承载基石,服务器的选型直接决定了业务的稳定性与扩展上限,本文基于……

    2026年6月17日
    2800
  • asppost数据揭示了哪些行业趋势?30字疑问长尾标题,asppost数据深度解析,行业趋势揭秘!

    在ASP.NET开发中,ASPPost数据特指通过HTTP POST方法提交到服务器的表单数据或API请求体,这类数据通常以键值对(如Request.Form)或结构化格式(JSON/XML)传输,是Web应用交互的核心载体,正确处理ASPPost数据直接影响应用的安全性、性能和用户体验,ASPPost数据的核……

    2026年2月4日
    11100
  • asp产品属性如何优化配置以提升用户体验和销售转化?

    ASP产品属性是指Active Server Pages技术中用于构建动态网页的核心特性与功能模块,涵盖服务器端脚本执行、数据库集成、组件对象模型支持等关键要素,这些属性共同决定了ASP在Web开发中的效率、灵活性与扩展能力,是开发高性能企业级应用的基础,ASP核心属性解析服务器端脚本执行ASP采用VBScri……

    2026年2月3日
    12100
  • 服务器crc接口是什么意思?服务器crc接口报错怎么解决

    服务器CRC接口的核心价值在于保障数据传输的完整性与准确性,它是存储系统与网络通信中不可或缺的校验机制,该接口通过特定的算法计算循环冗余校验码,能够高效检测数据在传输过程中是否发生错误,从而确保业务系统的稳定性,对于企业级应用而言,优化服务器CRC接口的配置与处理逻辑,是提升数据可靠性和系统吞吐量的关键技术手段……

    2026年4月4日
    11900
  • nba2k21连接不到服务器是什么原因,怎么办

    NBA 2K21连接不到服务器,核心解决思路是先从网络环境开始排查,再验证游戏服务器状态,最后考虑使用加速器或修改DNS,绝大多数情况都能恢复连接,为什么NBA 2K21连接不到服务器?常见原因分析连接失败背后通常不是单一原因,而是由网络、服务器和本地设置共同影响,业内专家指出,国内玩家遭遇连接问题,90%以上……

    2026年7月31日
    900
  • 语音芯片开发方案如何选择?语音芯片开发方案

    从选型到落地的核心路径语音芯片开发的核心在于精准选型、高效固件开发、算法深度集成与严格测试验证的系统化流程,精准选型:奠定成功基石算力与内存: 明确需求(如离线唤醒词数量、命令词条数、降噪等级),评估芯片的NPU算力(如0.5 TOPS起)、RAM/Flash容量(如512KB+4MB为常见基础),关键接口……

    2026年2月16日
    15930
  • ai云计算是什么意思,ai云计算有哪些优势

    AI云计算已成为推动企业数字化转型的核心引擎,其本质是通过云端强大的算力资源与智能算法的深度融合,实现数据价值的最大化释放,企业若想在激烈的市场竞争中占据先机,必须构建以AI云计算为底座的智能化技术架构,这不仅是技术升级的必然选择,更是重塑商业模式的战略支点,算力重构:AI云计算的核心价值逻辑传统云计算主要解决……

    2026年3月1日
    11900
  • 公司服务器登录不上怎么办,服务器远程连接失败解决方法

    公司服务器登录不上怎么办在数字化转型的浪潮中,服务器是企业业务连续性的基石,当远程桌面连接(RDP)或SSH终端突然无法响应,屏幕定格在“正在连接”或“连接被拒绝”时,许多IT运维人员会陷入焦虑,这不仅是技术故障,更是对应急响应能力、底层架构稳定性以及服务商专业度的严峻考验,本文将深入剖析服务器登录失败的常见成……

    2026年6月28日
    1200
  • alchemy.js是什么?alchemy.js使用方法详解

    alchemy.js 并非传统的后端框架,而是一个专注于前端图形渲染与交互逻辑的高性能 JavaScript 库,它通过轻量级的 API 设计,让开发者能在浏览器中轻松实现复杂的可视化效果与动态交互体验,在 2026 年的前端开发生态中,随着 WebGL 和 Canvas 技术的普及,开发者对页面视觉表现力的要……

    2026年6月3日
    4700
  • DNF当前拍卖行服务器的处理量过多怎么办,是什么原因?

    拍卖行服务器处理量过多时,最有效的办法是立即停止上架操作并切换频道,同时清理系统缓存,而非反复刷新或重开拍卖行界面,这个结论来自多数老玩家的实战经验,当你看到“处理量过多”的红色提示时,频繁点击只会加重服务器负担,让你的角色陷入更长的排队等待,下面我从问题成因、具体操作到长期预防,一步步拆解解决方案,拍卖行处理……

    程序开发 2026年8月10日
    700

发表回复

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