SpringBoot接口 - 如何参数校验国际化

SpringMVC——国际化LocaleResolver 认识国际化 一、国际化开发概述   软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。 国际化(internationalization)又称为i18n(读法为i 18 n,据说是因为internationalization(国际化)这个单词从i到n之间有18个英文字母,i18n的名字由此而来) 二、合格的国际化软件   软件实现国际化,...... 阅读详情
上文我们学习了如何对SpringBoot接口进行参数校验,但是如果需要有国际化的信息(比如返回校验结果有中英文),应该如何优雅处理呢?

什么是国际化

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。国际化又称为 i18n:internationalization

实现案例

这里实现一个案例: 语言切换和国际化(中英文)验证信息。

定义资源文件

在Resources下添加如下:

填写名称和资源语言类型

添加中英文对应的message

使用message

@Data
@Builder
@ApiModel(value = "User", subTypes = {AddressParam.class})
public class UserParam implements Serializable {

    private static final long serialVersionUID = 1L;

    @NotEmpty(message = "{user.msg.userId.notEmpty}") // 这里
    private String userId;
}

中英文切换拦截

由于默认是拦截request参数获取locale参数来实现的切换语言,这里我们可以改下,优先从header中获取,如果没有获取到再从request参数中获取。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.support.RequestContextUtils;

/**
 * custom locale change interceptor.
 *
 */
@Slf4j
public class CustomLocaleChangeInterceptor extends LocaleChangeInterceptor {

    /**
     * try to get locale from header, if not exist then get it from request parameter.
     *
     * @param request  request
     * @param response response
     * @param handler  handler
     * @return bool
     * @throws ServletException ServletException
     */
    @Override
    public boolean preHandle(HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) throws ServletException {
        String newLocale = request.getHeader(getParamName());
        if (newLocale!=null) {
            if (checkHttpMethods(request.getMethod())) {
                LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
                if (localeResolver==null) {
                    throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
                }
                try {
                    localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
                } catch (IllegalArgumentException ex) {
                    if (isIgnoreInvalidLocale()) {
                        log.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
                    } else {
                        throw ex;
                    }
                }
            }
            return true;
        } else {
            return super.preHandle(request, response, handler);
        }
    }

    private boolean checkHttpMethods(String currentMethod) {
        String[] configuredMethods = getHttpMethods();
        if (ObjectUtils.isEmpty(configuredMethods)) {
            return true;
        }
        for (String configuredMethod : configuredMethods) {
            if (configuredMethod.equalsIgnoreCase(currentMethod)) {
                return true;
            }
        }
        return false;
    }
}

初始化相关配置

import java.util.Locale;

import lombok.RequiredArgsConstructor;
import org.springframework.boot.validation.MessageInterpolatorFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

/**
 * This class is for web config.
 */
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

    /**
     * lang param name in header, default to 'locale'.
     */
    private static final String LANGUAGE_PARAM_NAME = LocaleChangeInterceptor.DEFAULT_PARAM_NAME;

    /**
     * message source.
     */
    private final ResourceBundleMessageSource resourceBundleMessageSource;

    /**
     * default locale.
     *
     * @return locale resolver
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
        return localeResolver;
    }

    /**
     * local validator factory bean.
     *
     * @return LocalValidatorFactoryBean
     */
    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory();
        factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
        factoryBean.setValidationMessageSource(resourceBundleMessageSource);
        return factoryBean;
    }

    /**
     * locale change interceptor.
     *
     * @return LocaleChangeInterceptor
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor interceptor = new CustomLocaleChangeInterceptor();
        interceptor.setParamName(LANGUAGE_PARAM_NAME);
        return interceptor;
    }

    /**
     * register locale change interceptor.
     *
     * @param registry registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

校验

  • 设置语言是中文

查看校验结果

  • 设置语言是英文

查看校验结果

示例源码

https://download.youkuaiyun.com/download/DeveloperFire/87554658

推荐阅读

Java面试系列-MySQL

JAVA面试汇总(精选系列)

SpringBoot Validation:从注解到全局异常处理的优雅校验实践 本文详细介绍了SpringBoot Validation在参数校验中的优雅实践,从基础注解使用到全局异常处理,涵盖分组校验、嵌套对象校验和自定义校验器等高级技巧。通过对比传统if-else方式,展示了声明式校验的高效性,并提供了性能优化和常见问题排查方案,帮助开发者构建健壮的Web应用。 阅读详情

相关推荐

SpringBoot 3.x实战:从零到一搞定多语言支持,手把手教你配置i18n(含异常与参数校验国际化)

本文详细介绍了如何在SpringBoot 3.x中实现完整的国际化方案,包括动态消息解析、异常统一处理和JSR303校验的深度整合。通过实战案例,帮助开发者从零配置i18n,解决多语言支持中的核心问题,提升应用的国际化能力。

weixin_30352645的博客 54

springboot 实现国际化语言切换

一、配置 1、springboot配置 spring: messages: basename: i18n/messages encoding: UTF-8 2、文件 内容: messages.properties和messages_zh_CN.properties text.value=我是中国人 messages_en_US.properties text.value=I'm Chinese 3、代码 1、I18nConfig.java p..

wwwzhouzy的专栏 2774

Java 接口支持国际化

产品开发中 ,会遇到很多国际化的需求。 一:核心接口 ResponseBodyAdvice 此接口提供 接口在返回之前切面处理类,思想与spring Aop 一样。 MessageSource 此接口提供动态获取message。 String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException; 参数秒数:code : 自定义错误码 .locale :获取什么语言的

纯洁的明依 1108

Springboot之国际化

1.目录结构和效果图 2.在resources目录下创建i18n资源文件,并写入数据 3.导入config @Configuration @EnableAutoConfiguration @ComponentScan public class LocaleConfig extends WebMvcConfigurerAdapter { @Bean public Loca...

cwf_13的博客 216

SpringBoot第13讲:SpringBoot接口如何参数校验国际化

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。国际化又称为 i18n:internationalization在Resources下添加如下:填写名称和资源语言类型添加中英文对应的message。

Jet_qi的博客 792

【ISAR成像】基于Matlab的飞机点目标模型仿真与图像优化

本文详细介绍了如何使用Matlab进行ISAR成像仿真,重点讲解了从构建飞机点目标模型到生成清晰图像的完整流程。通过模拟雷达回波、距离压缩、运动补偿及方位压缩等核心信号处理步骤,并结合相位梯度自聚焦等优化技巧,有效提升了ISAR图像的清晰度与分辨率。文章还分享了雷达参数调优、加窗处理等实战经验,为雷达信号处理与目标识别研究提供了实用指导。

weixin_29071809的博客 389

springboot 参数检查使用

springboot 项目中自带验证这一套的东西,不需要额外引入其他的jar 首先创建一个项目写一个user 实体 和 controller,其中三个方法分别是单参数,和实体类型的 /** * *user 实体类型 */ @Data public class User { @NotBlank(groups = {Add.class},message = "111") private String name; @NotEmpty(groups = Editor.class,mess.

weixin_41830440的博客 430

LSF实践专题(15):LSF队列优先级以及抢占功能初探

在LSF暂停作业时,会向作业发送一个SIGTSTP信号,并且将作业状态变成SSUSP(system suspend),表示被系统暂停,这时,最好是作业的应用能够捕获和处理SIGTSTP信号,否则,即使在LSF中,作业会被认为暂停了,并且释放了slots资源,但是在实际OS中,作业进程仍然在继续,并且不会释放CPU等计算资源。是指LSF自动将低优先级作业暂停(suspend),将空余出来的资源交给高优先级队列中的作业使用,等到高优先级队列的作业结束后,再将被暂停的作业恢复(resume)并继续运行。

richycn的博客 1920

Springboot国际化信息(i18n)解析

国际化信息理解 国际化信息也称为本地化信息 。 Java 通过 java.util.Locale 类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象 。举个例子吧,比如在发送一个具体的请求的时候,在header中设置一个键值对:"Accept-Language":"zh",通过Accept-Language对应值,服务器就可以决定使用哪一个区域的语言,找到相...

胡峻峥的博客 1万+

不用写代码!用AIStarter 5.0.0离线包部署InfiniteTalk的完整指南(Windows/Mac/Linux全平台)

本文详细介绍了如何使用AIStarter 5.0.0离线包在Windows、Mac和Linux平台上零代码部署InfiniteTalk数字人。从环境准备、离线资源获取与验证,到全平台部署实操指南,提供了完整的本地化安装流程和优化建议,帮助用户快速实现AI项目的一键部署。

weixin_30275415的博客 276

SAP前台处理:业务伙伴维护(客户主数据和供应商主数据)之基础视图 <BP>

这里主要讲解BP业务伙伴主数据中和财务相关的一些内容,包括基础视图数据,采购视图数据,销售视图数据,公司代码视图数据; S4统一了供应商和客户,从事务代码上:不再使用FD01和FK01进行维护,而使用事务代码BP统一维护;

SAP.David.Gao的博客 3462

Springboot 参数校验

自定义类实现 ConstraintValidator。/***/@Slf4j// 多例模式,每次注入都会创建一个新的实例@Component// 获取注解 baned 的内容, 线程安全因此设置为 @Scope("prototype")@Override@Override// 实际判断逻辑 判断通过: true 否则: false// 用户名是否存在逻辑 省略......实体类上使用自定义注解。/***/@Data。

weixin_39917908的博客 1666

SAP 采购订单入库——移动类型

业务场景:采购入库,实物入库至仓库,然后系统同步过账。MIGO:收货、采购订单。 MVT:101 入库,---库存增加。 MVT:移动类型,就是代表业务场景,(比如入库、发货,成本中心发、工单发、报废、盘赢、盘亏等等) 移动类型 1、正向采购入库:101 2、反向冲销(MIGO)102:与101相反,用于错误操作的反向冲销。参考原凭证,全部进行一...

willieyuan的博客 7781

springboot国际化处理枚举类,参数校验异常信息

springboot国际化处理枚举类,参数校验异常信息 1、国际化 1.1 pom文件 # springboot 启动类 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.c

weixin_42899433的博客 1435

数据处理和分析之数据聚类:层次聚类(Hierarchical Clustering):单链接层次聚类方法

单链接层次聚类(Single-Linkage Hierarchical Clustering)是凝聚型层次聚类的一种,它基于数据点之间的最小距离来定义聚类间的相似性。在单链接层次聚类中,两个聚类之间的距离定义为这两个聚类中任意两个数据点之间的最短距离。这种聚类方法倾向于形成链状或线性的聚类,因为聚类的边界是由最远的数据点决定的,而不是聚类的平均或中心位置。单链接层次聚类通过计算簇间最近点的距离来决定簇的合并,这种方法简单直观,但可能导致簇的形状不规则,尤其是在数据点分布不均匀的情况下。

2401_87715305的博客 1443

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2765

SpringBoot校验框架Validation、统一异常处理及项目的国际化

Validation校验框架 传统代码开发,接口参数基本校验一般在Controller层完成,在校验时会写很多的if判断,导致代码冗长。幸运的是lombok的Validation校验框架提供了很多注解,运用这些注解做参数校验就变得非常简单了。具体做法是在Controller层方法入口参数上加上@Valid注解开启参数验证 @PostMapping("/save") @ApiOperation("生成提货任务") public Result save(@RequestBody @Val

weixin_51373348的博客 2624

【异常】XXL-JOB提示异常ERROR com.xxl.job.core.util.XxlJobRemotingUtil - connect timed out

打开XXL-JOB的ELK,发现一堆报错。

奶爸的编程之路,也就一周冷个三天 2049

从源码到实践:构建个性化Spring Boot参数校验器

自定义实现Springboot参数校验

做一个有思想的技术人 934

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring国际化和Validation

validation与国际化结合,自定义注解校验,内部方法上使用注解校验

weixin_46488959的博客 2216

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

你开发的系统国际化了吗?

通过结合和的国际化支持,我们可以轻松实现接口参数校验与国际化处理。这种方式不仅提高了数据的完整性和准确性,还提升了用户体验。在实际开发中,我们还可以根据具体需求对参数校验进行更细粒度的控制,比如使用自定义校验注解、分组校验等。同时,也可以结合Spring Boot的其他功能,如全局异常处理、数据绑定等,来构建更加健壮和灵活的应用。欢迎关注我的公众号“程序员洋哥”,原创技术文章第一时间推送。

bing_gege的博客 482

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spring Boot 参数校验 Validation 入门

1. 概述 在想标题的时候,到底应该叫数据校验,还是参数校验时,我纠结了,而且非常。 最后,考虑参数校验更贴近我们的理解,就选择了它。实际更合适的叫法,还是数据校验。 文头艿艿瞎哔哔了一些碎碎念,嫌弃的胖友,可以跳往「3. 快速入门」。 当我们想提供可靠的 API 接口,对参数的校验,以保证最终数据入库的正确性,是必不可少的活。例如说,用户注册时,会校验手机格式的正确性,密码非弱密...

weixin_42073629的博客 1663

SpringBoot拦截器 - 六大核心场景

SpringBoot拦截器 - 六大核心场景

weixin_46619605的博客 1247

【SpringBoot专题】参数校验国际化之validator

【SpringBoot专题】参数校验国际化之validator 开发过程中,参数校验必不可少,当然校验的方式有很多,之前用过缺少哪个参数,直接抛异常,然后交给全局异常处理器给出,这样的方式可能让这些校验代码掺杂在一起,不利于维护,基于注解的方式读取配置文件,还能国际化,笔者觉得这样更加优雅,提高代码的可维护性,话不多说,talk is cheap, show me your code。 首先需要配...

batman 1905

Springboot中接口参数校验N种方法你会几个?

环境:springboot2.2.10.RELEASE Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),结合BindingResult对象可以直接获取错误信息。 JSR是什么? JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新

asoklove的专栏 1721
上一篇: SpringBoot接口 - 如何对参数进行校验
下一篇: SpringBoot接口 - 如何统一异常处理
毕设王同学
博客等级 码龄12年 133粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕设王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值