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

2025-11-07 0 775

一、参数校验

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 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文件

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

文件中添加需要打印的消息,如:

demo.key.null=demo的key不能为空 start.ge.end = 开始日期{0}必须小于结束日期{1}! demo.key.length=demo的key长度不正确

2. 在application.yml中添加配置

spring: messages: encoding: UTF8 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)); }

测试调用和返回结果,返回的数据和预期相符合

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

三、国际化参数校验

根据上面的修改

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

}

总结

到此这篇关于SpringBoot参数校验与国际化使用教程的文章就介绍到这了。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

遇见资源网 后端开发 SpringBoot参数校验与国际化使用教程 https://www.ox520.com/4449.html

常见问题

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务