Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot 2.0参数校验Hibernate Validator

SpringBoot 2.0参数校验Hibernate Validator

作者头像
喜欢天文的pony站长
发布于 2020-06-29 03:54:26
发布于 2020-06-29 03:54:26
1.1K00
代码可运行
举报
文章被收录于专栏:RabbitMQ实战RabbitMQ实战
运行总次数:0
代码可运行

Spring Boot (v2.0.5.RELEASE) Hibernate Validator

springboot起步依赖自动添加了对 hibernate validator的依赖

或者也可以自己手动添加依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>6.0.13.Final</version>
</dependency>

1. 新建配置类 HibernateValidatorConfiguration.class

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.futao.springmvcdemo.utils;

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.Validation;
import javax.validation.Validator;

/**
 * @author futao
 * Created on 2018/9/23-20:00.
 * Hibernate Validator配置类
 */
@Configuration
public class HibernateValidatorConfiguration {

    /**
     * JSR和Hibernate validator的校验只能对Object的属性进行校验
     * 不能对单个的参数进行校验
     * spring 在此基础上进行了扩展
     * 添加了MethodValidationPostProcessor拦截器
     * 可以实现对方法参数的校验
     *
     * @return
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        processor.setValidator(validator());
        return processor;
    }

    @Bean
    public static Validator validator() {
        return Validation
                .byProvider(HibernateValidator.class)
                .configure()
                //快速返回模式,有一个验证失败立即返回错误信息
                .failFast(true)
                .buildValidatorFactory()
                .getValidator();
    }
//
//    public static <T> void validate(T obj) {
//        Set<ConstraintViolation<T>> constraintViolations = validator().validate(obj);
//        if (constraintViolations.size() > 0) {
//            throw LogicException.le(constraintViolations.iterator().next().getMessage());
//        }
//    }
}

2.定义错误消息(统一异常处理请查看)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.futao.springmvcdemo.model.entity.constvar;

/**
 * @author futao
 * Created on 2018/9/21-15:29.
 * 错误提示集合类
 * 错误码构成:   01程序员编号
 * 001该程序员定义的错误码
 * 后面再跟上错误信息
 */
public final class ErrorMessage {
    public static final String SYSTEM_EXCEPTION = "系统繁忙,请稍后再试";
    public static final String NOT_LOGIN = "01001_您还未登陆或者登陆已超时,请重新登陆";
    public static final String MOBILE_ALREADY_REGISTER = "01002_该手机号已经被注册了";
    public static final String LOGIC_EXCEPTION = "01003_对不起,你是真的没有我帅";
    public static final String MOBILE_LEN_ILLEGAL = "01004_手机号长度不合法";
    public static final String EMAIL_ILLEGAL = "01005_邮箱格式不合法";
    public static final String USERNAME_LEN_ILLEGAL = "01006_名字长度不合法";
}

3. 在全局异常处理类中拦截验证框架抛出的 ConstraintViolationException异常, 通过调试可以看到我们定义的异常信息在 ((ConstraintViolationException)e).getConstraintViolations().iterator().next().getMessage()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.futao.springmvcdemo.foundation;

import com.alibaba.fastjson.JSONObject;
import com.futao.springmvcdemo.model.entity.constvar.ErrorMessage;
import com.futao.springmvcdemo.model.system.RestResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolationException;

/**
 * @author futao
 * Created on 2018/9/21-15:13.
 * 异常统一处理,
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Object logicExceptionHandler(HttpServletRequest request, Exception e, HttpServletResponse response) {
        //系统级异常,错误码固定为-1,提示语固定为系统繁忙,请稍后再试
        RestResult result = new RestResult(false, "-1", e.getMessage(), ErrorMessage.SYSTEM_EXCEPTION);
        //如果是业务逻辑异常,返回具体的错误码与提示信息
        if (e instanceof LogicException) {
            LogicException logicException = (LogicException) e;
            result.setCode(logicException.getCode());
            result.setErrorMessage(logicException.getErrorMsg());
            //Validator验证框架抛出的业务逻辑异常
        } else if (e instanceof ConstraintViolationException) {
            String message = ((ConstraintViolationException) e).getConstraintViolations().iterator().next().getMessage();
            result.setCode(message.substring(0, 5));
            result.setErrorMessage(message.substring(6));
        } else {
            //对系统级异常进行日志记录
            logger.error("系统异常:" + e.getMessage(), e);
        }
        return JSONObject.toJSON(result);
    }
}

4. 使用

  • 可以在进入业务逻辑之前的controller层对数据进行验证,即把参数验证注解打在controller的入参 3.1 将验证注解打在controller层
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author futao
 * Created on 2018/9/19-15:05.
 */
@RequestMapping(path = "User", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@RestController
@Validated
public class UserController {

    @Resource
    private UserService userService;

/**
     * 用户注册
     *
     * @param username 用户名
     * @param age      年龄
     * @param mobile   手机号
     * @param email    邮箱
     * @param address  地址
     * @return
     */
    @PostMapping("register")
    public JSONObject register(
            /*使用@RequestBody注解需要保证该对象有默认的空的构造函数
             * 是流的形式读取,那么流读了一次就没有了
             * */
            @RequestParam("username")
            @Size(min = 3, max = 8, message = ErrorMessage.USERNAME_LEN_ILLEGAL)
                    String username,
            @RequestParam("age")
                    String age,
            @Size(max = 11, message = ErrorMessage.MOBILE_LEN_ILLEGAL)
            @RequestParam("mobile")
                    String mobile,
            @RequestParam("email")
            @Email(message = ErrorMessage.EMAIL_ILLEGAL)
                    String email,
            @NotBlank
            @RequestParam("address")
                    String address
    ) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("result", "注册失败");
        if (userService.register(username, age, mobile, email, address)) {
            jsonObject.put("result", "注册成功");
        }
        return jsonObject;
    }
}

5. 测试验证:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 喜欢天文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自定义Hibernate Validator校验注解
写代码的时候发现:如果Controller层返回的对象没有getter和setter会抛出 org.springframework.web.HttpMediaTypeNotAcceptableException:Couldnotfind acceptable representation异常
喜欢天文的pony站长
2020/06/29
1.2K0
自定义Hibernate Validator校验注解
hibernate-validator校验参数(统一异常处理)
Bean Validation源于JSR-303 ,而JSR303是 Java EE 6 中的一项子规范。JSR349、JSR380是其升级版,添加了一些新的特性。Oracle公司传统艺能,一流公司定标准,它们只定义了一些校验注解(Constraint),如@Null@NotNull@Pattern],位于javax.validation.constraints包下,只提供规范不提供实现。
鱼找水需要时间
2023/02/16
1.6K0
hibernate-validator校验参数(统一异常处理)
springboot使用hibernate validator校验
一、参数校验  在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整,需要去翻阅验证逻辑代码 hibernate validator(官方文档)提供了一套比较完善、便捷的验证实现方式。 spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。 二、hiberna
庞小明
2018/03/07
5.7K0
这么写参数校验(validator)就不会被劝退了~
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,在代码中相当冗长,充满了if-else这种校验代码,今天我们就来学习spring的javax.validation 注解式参数校验。
良月柒
2019/10/28
1.1K0
这么写参数校验(validator)就不会被劝退了~
Spring Boot 参数校验
基于spring-boot的验证参数比较简单,在spring-boot-starter-web包里面有hibernate-validator包,它提供了一系列验证各种参数的方法,所以说spring-boot已经帮我们想好要怎么解决这个问题了。
吟风者
2019/08/20
2.3K0
Spring Boot 参数校验
Hibernate Validator 数据校验框架
JSR303是专家组成员向JCP提交的第1版Bean Validation,即针对bean数据校验提出的一个规范,使用注解方式实现数据校验。后面有升级版本JSR349及JSR380。
Java微观世界
2025/01/21
2580
Hibernate Validator 数据校验框架
基于注解的用户权限拦截Spring HandlerInterceptor
4.1 测试未登录情况下调用标记了 @LoginUser的获取当前登陆用户信息接口
喜欢天文的pony站长
2020/06/29
1.1K0
基于注解的用户权限拦截Spring HandlerInterceptor
补习系列-springboot 参数校验详解
在定义 Restful 风格的接口时,通常会采用 PathVariable 指定关键业务参数,如下:
美码师
2018/08/27
2.7K0
spring boot 中使用 hibernate validate 校验
spring boot 中使用 Hibernate validate 进行入参字段校验,一般用于web 接口入参校验,用起来非常方便。
潇洒
2019/07/03
1.7K0
开撸!SpringBoot-表单验证-统一异常处理-自定义验证信息源
我们都知道前台的验证只是为了满足界面的友好性、客户体验性等等。但是如果仅靠前端进行数据合法性校验,是远远不够的。因为非法用户可能会直接从客户端获取到请求地址进行非法请求,所以后台的校验是必须的;特别是应用如果不允许输入空值,对数据的合法性有要求的情况下。
IT大咖说
2021/09/08
2.6K0
开撸!SpringBoot-表单验证-统一异常处理-自定义验证信息源
Springboot国际化
源代码: https://github.com/FutaoSmile/springbootFramework
喜欢天文的pony站长
2020/06/29
8580
Springboot国际化
springboot整合elasticsearch全文检索入门
下载elasticsearch与kibana https://www.elastic.co/start
喜欢天文的pony站长
2020/06/29
1.3K0
springboot整合elasticsearch全文检索入门
Dubbo使用jsr303框架hibernate-validator遇到 ConstraintDescriptorImpl could not be instantiated
Dubbo可以集成jsr303标准规范的验证框架,作为验证框架不二人选的hibernate-validator是大家都会经常在项目中使用的,但是在Dubbo使用是会发生下面这个问题。
王念博客
2019/07/25
1.7K0
如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
Guide哥
2020/05/07
1.5K0
如何在 Spring/Spring Boot 中做参数校验?你需要了解的都在这里!
Spring Validation最佳实践及其实现原理,参数校验没那么简单
本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底! 项目源码:spring-validation
用户1289394
2020/12/21
1.9K0
Hibernate Validator校验
1. 参数校验 ---- 官网地址 spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。 2. hibernate validator校验demo ---- 1. 导入包 import org.hibernate.validator.constraints.NotBlank; import javax.validation.constraints.AssertFalse; import javax
山海散人
2021/03/03
9520
springboot validation参数校验
其中在spring-boot-starter-web中有hibernate-validater的依赖。
山行AI
2019/08/26
3.8K0
springboot validation参数校验
Spring Boot参数校验以及分组校验的使用
做web开发有一点很烦人就是要对前端输入参数进行校验,基本上每个接口都要对参数进行校验,比如一些非空校验、格式校验等。
Vincent-yuan
2021/08/12
1.8K0
Controller层代码这么写,简洁又优雅!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
3930
Controller层代码这么写,简洁又优雅!
如何在 Spring/Spring Boot 中优雅地做参数校验?
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
Guide哥
2021/04/27
2.1K0
推荐阅读
相关推荐
自定义Hibernate Validator校验注解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验