SpringBoot参数校验与国际化使用教程
作者:weisen 发布时间:2021-11-13 15:52:21
一、参数校验
springboot 使用校验框架validation校验方法的入参
SpringBoot的Web组件内部集成了hibernate-validator,所以我们这里并不需要额外的为验证再导入其他的包。
1、bean 中添加标签
标签需要加在属性上,@NotEmpty标签String的参数不能为空
@Data
public class DemoDto {
@NotEmpty(message = "名称不能为空")
private String name;
@Length(min = 5, max = 25, message = "key的长度为5-25")
private String key;
@Pattern(regexp = "[012]", message = "无效的状态标志")
private String state;
}
2、Controller中开启验证
在Controller 中 请求参数上添加@Validated 标签开启验证
@RequestMapping("test")
public String test(@Valid @RequestBody DemoDto dto){
System.out.println("test....................");
return "test.........................";
}
测试返回结果
{
"timestamp": "2020-01-14 13:30:03",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"Length.demoDto.key",
"Length.key",
"Length.java.lang.String",
"Length"
],
"arguments": [
{
"codes": [
"demoDto.key",
"key"
],
"arguments": null,
"defaultMessage": "key",
"code": "key"
},
25,
5
],
"defaultMessage": "key的长度为5-25",
"objectName": "demoDto",
"field": "key",
"rejectedValue": "11",
"bindingFailure": false,
"code": "Length"
},
{...},
{...}
],
"message": "Validation failed for object='demoDto'. Error count: 3",
"path": "/test"
}
返回的错误信息比较乱,需要统一整理,这个时候可以使用全局异常处理的方法
3、异常处理,捕获错误信息
当验证不通过时会抛异常出来。在异常处理器中捕获异常信息(因为验证不通过的项可能是多个所以统一捕获处理),并抛给前端。(此处是前后端分离开发)
@RequestMapping("test")
public ResultBean test(@Valid @RequestBody DemoDto dto){
System.out.println("test....................");
return new ResultBean("test.........................");
}
这里统一返回一个自定义的ResultBean类型
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResultBean methodArgumentNotValid(HttpServletRequest req, MethodArgumentNotValidException ex) {
ResultBean result = ResultBean.FAIL;
List<ObjectError> errors =ex.getBindingResult().getAllErrors();
StringBuffer errorMsg=new StringBuffer();
errors.stream().forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
log.error("---MethodArgumentNotValidException Handler--- ERROR: {}", errorMsg.toString());
result.setMsg(errorMsg.toString());
return result;
}
}
此时的返回结果为:
{
"code": 500,
"msg": "无效的状态标志;key的长度为5-25;名称不能为空;",
"content": null
}
二、分组校验
有时候需要在不同的方法中对同一个bean中的参数进行校验
1、在dto中添加groups
@Data
public class DemoDto {
public interface Default {
}
public interface Update {
}
@NotEmpty(message = "名称不能为空")
private String name;
@Length(min = 5, max = 25, message = "key的长度为5-25" ,groups = Default.class )
private String key;
@Pattern(regexp = "[012]", message = "无效的状态标志",groups = {Default.class,Update.class} )
private String state;
}
2、在controller中需要用到@Validated来校验
@RequestMapping("test2")
public String test2(@Validated(value = DemoDto.Default.class) @RequestBody DemoDto dto){
System.out.println("test....................");
return "test.........................";
}
@RequestMapping("test4")
public String test4(@Validated(value = {DemoDto.Default.class,DemoDto.Update.class}) @RequestBody DemoDto dto){
System.out.println("test....................");
return "test.........................";
}
三、国际化返回配置文件的信息
1. 在Resource下添加properties文件
文件中添加需要打印的消息,如:
demo.key.null=demo的key不能为空
start.ge.end = 开始日期{0}必须小于结束日期{1}!
demo.key.length=demo的key长度不正确
2. 在application.yml中添加配置
spring:
messages:
encoding: UTF-8
basename: message/messages_zh
3. 使用方法
在类中直接注入,即可使用
@Autowired
private MessageSource messageSource;
@RequestMapping("getMessageByKey")
public ResultBean getMessageByKey(@Valid @RequestBody DemoDto dto){
String key = dto.getKey();
String [] param = {"2019-8-8", "2019-9-9"};
return new ResultBean(messageSource.getMessage(key, param, Locale.CHINA));
}
测试调用和返回结果,返回的数据和预期相符合
三、国际化参数校验
根据上面的修改
1、bean 中添加标签
标签需要加在属性上,@NotEmpty标签String的参数不能为空
@Data
public class DemoDto {
@NotEmpty(message = "{demo.key.null}")
@Length(min = 5, max = 25, message = "{demo.key.length}")
private String key;
}
2、添加上ValidationMessages文件
国际化配置文件必须放在classpath的根目录下,即src/java/resources的根目录下。
国际化配置文件必须以ValidationMessages开头,比如ValidationMessages.properties 或者 ValidationMessages_en.properties。
在/resources的根目录下添加上ValidationMessages.properties文件
demo.key.null=demo的key不能为空,这里是validationMessage
demo.key.length=demo的key长度不正确
3、返回结果
{
"code": 500,
"msg": "demo的key不能为空,这里是validationMessage;",
"content": null
}
自定义properties文件
SpringBoot 国际化验证 @Validated 的 message 国际化资源文件默认必须放在 resources/ValidationMessages.properties 中。
现在我想把资源文件放到 resources/message/messages_zh.properties 中
若要自定义文件位置或名称则需要重写WebMvcConfigurerAdapter 的 getValidator 方法,但WebMvcConfigurerAdapter在springboot2中已经废弃了,可以改为使用WebMvcConfigurationSupport
在一的基础上修改:
@Configuration
public class ValidatorConfiguration extends WebMvcConfigurationSupport {
@Autowired
private MessageSource messageSource;
@Override
public Validator getValidator() {
return validator();
}
@Bean
public Validator validator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource);
return validator;
}
}
最后得到结果为:
{
"code": 500,
"msg": "demo的key不能为空ID:{0};",
"content": null
}
参考文章:
spring boot国际化——MessageSource的使用
来源:https://www.jianshu.com/p/46eda1f96abe


猜你喜欢
- 问题背景实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号)。项目中有一个需求是要实时统计一些数据,一个应用下可能有多个相同的账号。
- 本文实例为大家分享了Java Web实现简易图书管理系统的具体代码,供大家参考,具体内容如下前言首先实现的是用户的登录注册,注册成功后自动跳
- 场景:当我们正在master分支开发新功能的时候,突然接到一个任务发现线上出现了一个紧急的BUG需要修复,由于没有打新分支做这部分新需求,这
- 本文实例讲述了Java面向接口编程之简单工厂模式。分享给大家供大家参考,具体如下:一 代码interface Output{ /
- 消息过滤RocketMQ分布式消息队列的消息过滤方式有别于其它MQ中间件,是在Consumer端订阅消息时再做消息过滤的。RocketMQ这
- 前言如今,企业级应用程序的高性能安全加密的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同
- 数据库表结构departmentemployee要求一现在的要求是输入 id 把 employee 表的对应员工数据查询出来,并且查询出该员
- 前言最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大
- 在android开发中,通常使用xml格式来描述布局文件。就目前而言,熟悉android布局及美化的人员少之又少,出现了严重的断层。大部分企
- 目录开启定时任务注解@EnableScheduling@Scheduled添加定时任务Cron表达式在线cron工具适应场景springBo
- 1、在pom.xml中引入actuator, security依赖 <dependency> &nbs
- LockSupport类用于创建锁和其他同步类的基本线程阻塞原语,此类与使用它的每个线程关联一个许可。如果获得许可,将立即返回对park的调
- 首先需要建立两个库进行测试,我这里使用的是master_test和slave_test两个库,两张库都有一张同样的表(偷懒,喜喜),表结构表
- 代码编译运行环境:VS2017+Debug+Win32按照参数形式的不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。对于基
- java实现五子棋小游戏package Gomoku;import java.awt.Toolkit;import javax.swing.
- 简单工厂模式解释: 简单工厂模式(Simple Fact
- 加密配置文件的SQL账号密码一般项目的配置文件里的信息都是明文的,导致有时候比较敏感的信息也直接暴露得超级明显,比如SQL的链接 账号 密码
- 本文为大家分享了JSplitPane的使用方法,供大家参考,具体内容如下1、swing分割窗口控件JSplitPane,用来将窗口分割成两个
- SpringBoot项目中新增脱敏功能项目背景目前正在开发一个SpringBoot项目,此项目有Web端和微信小程序端。web端提供给工作人
- 本文实例讲述了java实现word文档转pdf并添加水印的方法。分享给大家供大家参考,具体如下:前段时间,项目需要自动生成word文档,用W