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年2月11日
    14600
  • 云服务器IE相关疑难解答,IE浏览器兼容性问题怎么解决

    关于云服务器ie相关的问答在云计算日益普及的今天,许多用户在选择云服务器时,常会混淆“IE”这一概念,IE(Internet Explorer)是微软开发的浏览器,而非云服务器的核心组件,但在服务器运维、网站兼容性测试及企业内网部署场景中,用户往往关注的是如何在云服务器上配置、优化或解决与IE浏览器兼容性问题……

    程序开发 2026年6月9日
    3500
  • 公司买服务器好还是云服务器好,自建服务器与云服务器的区别

    在数字化转型的深水区,基础设施的稳定性直接决定了业务的上限,对于许多企业而言,自建物理服务器与租用云服务器并非简单的二选一,而是基于成本结构、运维能力与业务弹性需求的战略抉择,本文将基于真实测试数据与行业基准,深入剖析两种架构的优劣,并重点推荐适合中小型企业快速部署的高性价比云解决方案, 核心架构深度对比:自建……

    2026年6月26日
    2100
  • arm7开发板怎么样,arm7开发板哪个牌子好用

    ARM7开发板作为嵌入式系统学习与工业控制领域的经典硬件平台,其核心价值在于提供了低成本、高稳定性的32位RISC架构解决方案,是连接8位单片机与高性能ARM9、Cortex-A系列的桥梁,对于初学者而言,它不仅是掌握底层驱动编写的最佳练兵场,也是工程师进行低功耗、实时性项目开发的首选方案,选择一款合适的ARM……

    2026年3月20日
    10700
  • 防火墙技术的产生原因是什么?,主要有哪些类型?

    防火墙技术的产生防火墙技术诞生于20世纪80年代末,当时ARPANET(互联网前身)的规模迅速膨胀,网络安全事件频发,促使科研机构设计出第一代包过滤防火墙,1991年DEC公司的SEAL产品首次实现了应用层代理,随后状态检测、深度包检测(DPI)等技术逐步完善,防火墙的核心思想始终未变:在可信与不可信网络之间建……

    2026年7月15日
    500
  • mac mini适合ios开发吗,mac mini做开发配置要求

    Mac mini 是目前进行 iOS 开发性价比最高的选择,没有之一,它凭借苹果自研 M 系列芯片的强大性能、卓越的能效比以及相对亲民的价格,成为了个人开发者、中小型创业团队乃至大型企业构建 iOS 应用程序的首选生产力工具,对于致力于 iOS 生态的开发者而言,选择 Mac mini 不仅意味着获得了稳定、原……

    2026年3月22日
    15700
  • 公司服务器电脑配置怎么选?服务器配置清单及价格

    公司服务器电脑配置在数字化转型的浪潮中,服务器不仅是数据存储的容器,更是企业业务连续性的基石,对于中小企业及初创团队而言,选择一套高性价比、高稳定性的服务器配置方案,直接决定了网站的加载速度、数据库的响应效率以及整体用户体验,本文将基于真实测试环境,深入解析2026年主流服务器配置的性能表现,并结合最新的市场优……

    2026年6月29日
    2100
  • 美国GreencloudVPS怎么样?Greencloud绿云VPS实测体验与数据对比

    在全球化业务部署与跨境网络架构中,美国VPS始终是开发者与企业关注的核心节点,GreencloudVPS作为行业内运营多年的老牌服务商,凭借其独特的机房资源与定价策略,在市场中占据了一席之地,本次测评基于美国核心机房的实测数据,从底层硬件、网络性能、磁盘IO到真实业务承载能力进行全方位解析,并同步更新其2026……

    2026年4月29日
    4900
  • 个人买安全芯片怎么最优惠?安全芯片选购指南

    个人购买安全芯片优惠在数字化转型的深水区,数据安全已不再仅仅是大型企业的专属议题,而是每一位个人开发者、独立博主以及小微创业者必须直面的核心命题,随着《数据安全法》与《个人信息保护法》的深入实施,本地化数据加密与硬件级身份认证成为了构建可信数字身份的基石,对于个人用户而言,如何以最低的成本获取企业级的安全防护能……

    2026年6月30日
    1100
  • 如何安全访问数据库?,需要设置哪些安全措施?

    访问数据库是应用程序的命脉,优化好这一环节,你的系统性能就能提升一个档次, 无论是个人开发者还是企业团队,掌握数据库访问的原理和优化方法,都是必备技能,数据库访问慢怎么办?从连接池开始排查当应用响应变慢,第一条排查思路就是数据库访问层,数据库连接池是访问的起点,也是瓶颈高发区,连接池怎么设置才能避免性能陷阱连接……

    2026年7月28日
    600

发表回复

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