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

一、参数校验

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

1606200250412968

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

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));
 }

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

1606200262987976

三、国际化参数校验

根据上面的修改

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参数校验与国际化使用教程的文章就介绍到这了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容