SpringBoot参数校验与国际化使用教程

 更新时间:2020年11月24日 15:48  点击:2053

一、参数校验

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的使用

总结

到此这篇关于SpringBoot参数校验与国际化使用教程的文章就介绍到这了,更多相关SpringBoot参数校验与国际化使用内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Nest.js参数校验和自定义返回数据格式详解

    这篇文章主要给大家介绍了关于Nest.js参数校验和自定义返回数据格式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-28
  • 校验非空的注解@NotNull如何取得自定义的message

    这篇文章主要介绍了校验非空的注解@NotNull如何取得自定义的message,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-29
  • 解决Springboot get请求是参数过长的情况

    这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
  • PHP中empty和isset对于参数结构的判断及empty()和isset()的区别

    废话不多说了,直接给大家贴代码了。<&#63;php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = array(); //var $a8; $a9 = new test(); for ($i=1; $i <=9 ; $i++) {...2015-11-24
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • mysql配置模板(my-*.cnf)参数详细说明

    mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
  • 详解C#泛型的类型参数约束

    这篇文章主要介绍了C#泛型的类型参数约束的相关资料,文中讲解非常细致,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2020-07-31
  • C#中out参数、ref参数与值参数的用法及区别

    这篇文章主要给大家介绍了关于C#中out参数、ref参数与值参数的用法及区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • Java线程池中的各个参数如何合理设置

    这篇文章主要介绍了Java线程池中的各个参数如何合理设置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-19
  • vue+axios全局添加请求头和参数操作

    这篇文章主要介绍了vue+axios全局添加请求头和参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-24
  • 处理@PathVariable注解允许参数为空、允许不传参数的问题

    这篇文章主要介绍了处理@PathVariable注解允许参数为空、允许不传参数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-23
  • SpringBoot接口接收json参数解析

    这篇文章主要介绍了SpringBoot接口接收json参数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-19
  • pytorch 实现冻结部分参数训练另一部分

    这篇文章主要介绍了pytorch 实现冻结部分参数训练另一部分,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
  • 详解Java后端优雅验证参数合法性

    这篇文章主要介绍了详解Java后端优雅验证参数合法性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • 详解element-ui 表单校验 Rules 配置 常用黑科技

    这篇文章主要介绍了element-ui 表单校验 Rules 配置 常用黑科技,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • C#向线程中传递多个参数的解决方法(两种)

    这篇文章主要介绍了C#向线程中传递多个参数的解决方法(两种)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Vue 组件复用多次自定义参数操作

    这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • spring cloud gateway中如何读取请求参数

    这篇文章主要介绍了spring cloud gateway中如何读取请求参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-15
  • 使用JavaScript获取URL中的参数(两种方法)

    这篇文章主要介绍了使用JavaScript获取URL中的参数(两种方法)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-11-22
  • 解决antd Form 表单校验方法无响应的问题

    这篇文章主要介绍了解决antd Form 表单校验方法无响应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-28