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/article/536660.html

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

相关推荐

  • 公安局推广人脸识别门禁是真的吗?人脸识别门禁系统安装流程

    公安局推广人脸识别门禁随着“智慧公安”建设的深入,人脸识别门禁系统已从单一的社区安防工具,升级为城市级治安防控体系的关键节点,对于公安机关而言,门禁系统不再仅仅是“开门”的工具,而是数据采集中枢、身份核验终端以及应急指挥的前哨,在这一背景下,承载人脸识别算法与海量生物特征数据的后端服务器,其性能、稳定性及安全性……

    2026年6月29日
    1700
  • 百度app开发怎么做?百度app开发公司哪家好

    百度App开发的核心在于构建高性能、轻量化且具备深度分发能力的应用生态,企业应优先选择小程序形态或混合开发模式,以实现“搜索+信息流”双引擎驱动的流量获取,从而在百度移动生态中获得最佳的用户触达效率与转化效果,这一结论基于百度独特的搜索基因与内容生态逻辑,不同于传统的独立App开发,百度生态下的应用开发更强调内……

    2026年3月20日
    11800
  • ExtraVM日本美国VPS测评,4美元/月大带宽实测,ExtraVM VPS性能如何稳定?

    在云服务器市场日益内卷的今天,ExtraVM 作为一个主打高性价比的 VPS 服务商,凭借其灵活的计费模式和全球节点布局,逐渐进入技术圈层的视野,本次测评将基于真实测试环境,深入剖析其日本与美国节点的网络延迟、带宽吞吐量、I/O 性能及系统稳定性,并结合 2026 年最新优惠活动,为开发者、建站者及中小企业提供……

    程序开发 2026年5月25日
    44200
  • 顶级域名13类具体有哪些,个人网站选哪个域名好?

    顶级域名13类指的是ICANN集中批准的首批通用顶级域名,外加国家地区顶级域名构成的总称,涵盖了.com、.net、.org、.biz等常见后缀,新手选域名只需盯住行业属性、注册门槛、价格区间三个维度,就能快速锁定目标,顶级域名有哪些分类:13类后缀逐个拆解业内常说的顶级域名13类,源于ICANN早期批准的通用……

    2026年9月11日
    100
  • 马来西亚ControlVM VPS怎么样?69美元月付方案实测对比

    在东南亚服务器部署需求持续增长的背景下,马来西亚机房凭借其覆盖东南亚的低延迟网络优势,成为众多企业出海建站及业务拓展的重点考量对象,本次实测聚焦马来西亚本土服务商ControlVM,针对其月付69美元的VPS方案进行深度拆解,从硬件基准、网络质量到实际业务承载能力进行全方位评估,为服务器选型提供真实可靠的数据参……

    2026年4月28日
    5200
  • 服务器主机内网IP地址是什么?,怎么查?

    服务器主机内网IP地址是局域网内分配的私有IP,用于内部通信,不直接暴露在公网,是保障服务器安全的基础配置,无论是自建数据中心还是使用云服务器,内网IP的配置和管理都是运维人员必须掌握的技能,合理规划内网IP地址段,能有效提升网络效率并减少故障,服务器内网IP地址和公网IP地址的区别内网IP和公网IP在功能、安……

    2026年7月27日
    900
  • Unity3D游戏开发基础是什么?零基础如何快速入门Unity3D

    Unity3D作为全球领先的实时3D开发平台,其核心价值在于高效的工作流与跨平台能力,掌握Unity3D游戏开发基础,本质上是建立一套“场景构建-逻辑驱动-性能优化”的闭环思维体系,这不仅是学习一个引擎的操作,更是理解现代游戏开发工业化流程的必经之路,对于初学者而言,不应迷失在庞大的API文档中,而应聚焦于核心……

    2026年3月9日
    10400
  • 共建网络安全环境怎么做?如何提升网络安全防护能力

    共建网络安全环境在数字化转型的深水区,服务器不仅是承载业务的基石,更是守护数据资产的第一道防线,面对日益复杂的网络攻击手段和合规要求,选择一款兼具高性能与高安全性的服务器产品,已成为企业IT决策的核心痛点,本文基于真实测试环境与长期运行数据,深入解析当前主流服务器架构在安全性、稳定性及性价比上的表现,旨在为开发……

    2026年6月23日
    2600
  • 在线教育如何开发?在线教育平台开发流程与成本详解

    以学习效果为轴心,构建“技术-内容-服务”三位一体的闭环系统,仅靠技术堆砌或内容搬运无法实现可持续增长,真正成功的在线教育产品必须实现三者协同进化,以下从底层逻辑、关键模块、落地路径三方面展开说明,底层逻辑:三个不可逆趋势决定开发方向用户行为碎片化:73%的学习者单次学习时长低于15分钟(艾瑞咨询,2024……

    程序开发 2026年4月17日
    5100
  • wp8开发教程哪里有?新手入门指南推荐

    WP8 开发教程的核心在于掌握 Silverlight 框架与 XAML 语言的深度应用,并构建适配低功耗硬件的高性能代码逻辑,对于开发者而言,成功的关键并非仅仅掌握基础语法,而在于理解 Windows Phone 8 独特的后台任务机制、内存管理策略以及与原生代码的交互能力,这一开发体系要求开发者必须具备从……

    2026年4月1日
    9900

发表回复

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