springboot 配置 Validator 校验框架国际化 支持快速返回

1、国际化资源

使用IDEA创建资源组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、编写配置

application.yml 增加国际化目录配置

在这里插入图片描述
增加国际化配置类 从请求头获取多语言关键字

/**
 * 国际化配置
 *
 * @author Lion Li
 */
@Configuration
public class I18nConfig {

	@Bean
	public LocaleResolver localeResolver() {
		return new I18nLocaleResolver();
	}

	/**
	 * 获取请求头国际化信息
	 */
	static class I18nLocaleResolver implements LocaleResolver {

		@NotNull
		@Override
		public Locale resolveLocale(HttpServletRequest httpServletRequest) {
			String language = httpServletRequest.getHeader("content-language");
			Locale locale = Locale.getDefault();
			if (StrUtil.isNotBlank(language)) {
				String[] split = language.split("_");
				locale = new Locale(split[0], split[1]);
			}
			return locale;
		}

		@Override
		public void setLocale(@NotNull HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

		}
	}
}

3、用法详解

在 Header 请求头 增加上下文语言参数 content-language
参数需与国际化配置文件后缀对应
如 zh_CN en_US 等
在这里插入图片描述

4、测试获取 code 对应国际化内容

编写测试类

/**
 * 测试国际化
 *
 * @author Lion Li
 */
@RestController
@RequestMapping("/demo/i18n")
public class TestI18nController {

	@Autowired
	private MessageSource messageSource;

	/**
	 * 通过code获取国际化内容
	 * code为 messages.properties 中的 key
	 *
	 * 测试使用 user.register.success
	 */
	@GetMapping()
	public String get(String code) {
		return messageSource.getMessage(code, new Object[]{}, LocaleContextHolder.getLocale());
	}
}

测试接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.配置 Validator 校验 国际化

增加 validation 自动装配依赖

        <!-- 自定义验证注解 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

编写 validation 配置类

/**
 * 校验框架配置类
 *
 * @author Lion Li
 */
@Configuration
public class ValidatorConfig {

    @Autowired
    private MessageSource messageSource;

    /**
     * 配置校验框架 快速返回模式
     */
    @Bean
    public Validator validator() {
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        // 设置上方配置的国际化源
        factoryBean.setValidationMessageSource(messageSource);
        // 设置使用 HibernateValidator 校验器
        factoryBean.setProviderClass(HibernateValidator.class);
        Properties properties = new Properties();
        // 设置 快速异常返回
        properties.setProperty("hibernate.validator.fail_fast", "true");
        factoryBean.setValidationProperties(properties);
        // 加载配置
        factoryBean.afterPropertiesSet();
        return factoryBean.getValidator();
    }

}

编写全局异常处理 将所有的相关异常都进行拦截处理

	/**
     * 自定义验证异常
     */
    @ExceptionHandler(BindException.class)
    public AjaxResult<Void> handleBindException(BindException e) {
        log.error(e.getMessage(), e);
        String message = e.getAllErrors().stream()
            .map(DefaultMessageSourceResolvable::getDefaultMessage)
            .collect(Collectors.joining(", "));
        return AjaxResult.error(message);
    }

    /**
     * 自定义验证异常
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public AjaxResult<Void> constraintViolationException(ConstraintViolationException e) {
        log.error(e.getMessage(), e);
        String message = e.getConstraintViolations().stream()
            .map(ConstraintViolation::getMessage)
            .collect(Collectors.joining(", "));
        return AjaxResult.error(message);
    }

    /**
     * 自定义验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error(e.getMessage(), e);
        String message = e.getBindingResult().getFieldError().getDefaultMessage();
        return AjaxResult.error(message);
    }

编写测试类

/**
 * 测试国际化
 *
 * @author Lion Li
 */
@Validated
@Api(value = "测试国际化控制器", tags = {"测试国际化管理"})
@RestController
@RequestMapping("/demo/i18n")
public class TestI18nController {

    /**
     * Validator 校验国际化
     * 不传值 分别查看异常返回
     *
     * 测试使用 not.null
     */
    @ApiOperation("Validator 校验国际化")
    @GetMapping("/test1")
    public AjaxResult<Void> test1(@NotBlank(message = "{not.null}") String str) {
        return AjaxResult.success(str);
    }

    /**
     * Bean 校验国际化
     * 不传值 分别查看异常返回
     *
     * 测试使用 not.null
     */
    @ApiOperation("Bean 校验国际化")
    @GetMapping("/test2")
    public AjaxResult<TestI18nBo> test2(@Validated TestI18nBo bo) {
        return AjaxResult.success(bo);
    }

    @Data
    public static class TestI18nBo {

        @NotBlank(message = "{not.null}")
        private String name;

        @NotNull(message = "{not.null}")
        @Range(min = 0, max = 100, message = "{length.not.valid}")
        private Integer age;
    }
}

使用 Validator 框架校验 controller 参数返回国际化

controller 校验接口参数 需要在类增加 @Validated 注解
在这里插入图片描述
参数对应校验注解 使用 {code} 形式标注使用国际化处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用 Validator 框架校验 Bean 返回国际化

Bean 校验需要在接口校验 Bean 参数使用 @Validated 注解
在这里插入图片描述
Bean 内属性校验注解 使用 {code} 形式标注使用国际化处理
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Spring Boot数据校验,可以使用Hibernate Validator来实现。Hibernate Validator是一个基于JSR 380规范的校验框架,可以方便地在Spring Boot应用中进行数据校验。 首先,需要在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> ``` 接下来,在需要校验的实体类上使用注解来定义校验规则。例如,可以使用`@NotBlank`注解来验证字符串不能为空,`@Min`和`@Max`注解来验证数字的范围,等等。示例如下: ```java public class User { @NotBlank(message = "用户名不能为空") private String username; @Size(min = 6, max = 20, message = "密码长度必须在6到20之间") private String password; @Email(message = "邮箱格式不正确") private String email; // getters and setters } ``` 在需要校验的Controller的请求参数上使用`@Valid`注解,然后通过`BindingResult`参数获取校验结果。示例如下: ```java @RestController public class UserController { @PostMapping("/users") public ResponseEntity<String> createUser(@Valid @RequestBody User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { // 处理校验失败的情况 StringBuilder errorMessage = new StringBuilder(); for (FieldError error : bindingResult.getFieldErrors()) { errorMessage.append(error.getDefaultMessage()).append(". "); } return ResponseEntity.badRequest().body(errorMessage.toString()); } // 校验通过,执行创建用户的逻辑 // ... return ResponseEntity.ok("用户创建成功"); } } ``` 这样,当请求参数不满足校验规则时,会自动返回校验失败的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯狂的狮子Li

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

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

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

打赏作者

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

抵扣说明:

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

余额充值