JSR303参数校验与全局异常处理

Java秒杀系统方案优化 高性能高并发实战项目笔记四——结合MD5实现登录+JSR303参数校验+全局异常处理 在写本篇博客的时候,是在学完了分布式Session之后开始学的,在学的过程中也遇到了一点点阻力,我发现我平时代码的写法和这个老师讲的不一样的地方挺多的,比如现在引进了全局异常处理,我之前是不写异常处理类,直接return一个结果回来,看了好多视频都是用异常类处理的,可能这种方式真的比较好吧 本篇博客分三方面讲述: 登录模块 JSR303参数校验 全局异常处理 登录模块: MD5处理逻辑: ... 阅读详情

全局异常处理参考统一异常处理ControllerAdvice

一、前言

我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断, 为了安全 。因为请求很容易绕过前端,比如当测试使用 PostMan 来发送请求,如果后端没有校验,不就乱了吗?肯定会有很多异常的。

二、JSR303简介

JSR-303规范(Bean Validation规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能 。

Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

官方文档

三、导入依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

四、常用注解

Bean Validation 中内置的 constraint。

约束注解名称约束注解说明
@Null用于验证对象为null
@NotNull用于对象不能为null,无法查检长度为0的字符串
@NotBlank只用于String类型上,不能为null且trim()之后的size>0
@NotEmpty用于集合类、String类不能为null,且size>0。但是带有空格的字符串校验不出来
@Size用于对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length用于String对象的大小必须在指定的范围内
@Pattern用于String对象是否符合正则表达式的规则
@Email用于String对象是否符合邮箱格式
@Min用于Number和String对象是否大等于指定的值
@Max用于Number和String对象是否小等于指定的值
@AssertTrue用于Boolean对象是否为true
@AssertFalse用于Boolean对象是否为false

五、@Validated、@Valid区别

@Validated

  • Spring提供的
  • 支持分组校验
  • 可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
  • 由于无法加在成员属性(字段)上,所以无法单独完成级联校验,需要配合@Valid

@Valid

  • JDK提供的(标准JSR-303规范)
  • 不支持分组校验
  • 可以用在方法、构造函数、方法参数和成员属性(字段)上
  • 可以加在成员属性(字段)上,能够独自完成级联校验

@Validated级联其他对象,一个员工属于某个部门对象,需要使用@Validated在Controller方法参数前加上,@Valid必须加在员工中的部门属性上,不加则无法对部门对象里的属性进行校验!

@Data
public class Emp implements Serializable {

    //不能为空且不能为空串(调用trim()后)
    @NotBlank(message = "账号不能为空")
    private String username;
    
    @Valid //需要加上,否则不会验证Dept类中的校验注解
    @NotNull //并且需要触发该字段的验证才会进行嵌套验证。
    private Dept dept;
}

@Data
public class Dept implements Serializable {
    
    @NotBlank(message = "deptNameb不能为空")
    private String deptName;
}

@PostMapping("/test")
public Result test(@Validated @RequestBody Emp emp){

}

@Validated级联集合对象,一个学校对象里还有很多个学生对象需要使用@Validated在Controller方法参数前加上,@Valid必须加在学校中的学生属性上,不加则无法对学生对象里的属性进行校验!

@Data
public class School{

    @NotBlank
    private String id;
    
    private String name;
    
    @Valid                // 需要加上,否则不会验证student类中的校验注解
    @NotNull 			  // 且需要触发该字段的验证才会进行嵌套验证。
    private List<Student> list;
}

@Data
public class Student {

    @NotBlank
    private String id;
    
    private String name;
    
    private int age;
    
}

@PostMapping("/test")
public Result test(@Validated @RequestBody School school){

}

六、常用使用测试

1. 实体类添加校验

import lombok.Data;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

@Data
public class BrandEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 品牌id
	 */
	@NotNull(message = "修改必须有品牌id")
	private Long brandId;
	/**
	 * 品牌名F
	 */
	@NotBlank(message = "品牌名必须提交")
	private String name;
	/**
	 * 品牌logo地址
	 */
	@NotBlank(message = "地址必须不为空")
	private String logo;
	/**
	 * 介绍
	 */
	private String descript;
	
	/**
	 * 检索首字母
	 */
	//正则表达式
	@Pattern(regexp = "^[a-zA-Z]$",message = "检索的首字母必须是字母")
	private String firstLetter;
	/**
	 * 排序
	 */
	@Min(value = 0,message = "排序必须大于等于0")
	private Integer sort;

}

2. 统一返回类型

import com.alibaba.druid.util.StringUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//统一返回结果
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel
public class Result<T> {
    @ApiModelProperty("响应码")
    private Integer code;
    @ApiModelProperty("相应信息")
    private String msg;
    @ApiModelProperty("返回对象或者集合")
    private T data;

    //成功码
    public static final Integer SUCCESS_CODE = 200;
    //成功消息
    public static final String SUCCESS_MSG = "SUCCESS";

    //失败
    public static final Integer ERROR_CODE = 201;
    public static final String ERROR_MSG = "系统异常,请联系管理员";
    //没有权限的响应码
    public static final Integer NO_AUTH_COOD = 999;

    //执行成功
    public static <T> Result<T> success(T data){
        return new Result<>(SUCCESS_CODE,SUCCESS_MSG,data);
    }
    //执行失败
    public static <T> Result failed(String msg){
        msg = StringUtils.isEmpty(msg)? ERROR_MSG : msg;
        return new Result(ERROR_CODE,msg,"");
    }
    //传入错误码的方法
    public static <T> Result failed(int code,String msg){
        msg = StringUtils.isEmpty(msg)? ERROR_MSG : msg;
        return new Result(code,msg,"");
    }
    //传入错误码的数据
    public static <T> Result failed(int code,String msg,T data){
        msg = StringUtils.isEmpty(msg)? ERROR_MSG : msg;
        return new Result(code,msg,data);
    }
}

3. 测试类

@PostMapping("/add")
public Result add(@Valid @RequestBody BrandEntity brandEntity)  {

    return Result.success("成功");
}

遇到的坑:笔者在公司的项目中添加没什么问题,但是就是无法触发校验,看到的是 Springboot版本太高了 ,所有要添加下面的依赖才触发。

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.18.Final</version>
</dependency>

4. 我们把异常返回给页面

@PostMapping("/add")
public Result add(@Valid @RequestBody BrandEntity brandEntity, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        Map<String,String> map = new HashMap<>();
        bindingResult.getFieldErrors().forEach(item ->{
            map.put(item.getField(),item.getDefaultMessage());
        });
        return Result.failed(400,"提交的数据不合规范",map);
    }
    
    return Result.success("成功");
}

5. 异常处理结果

{
    "code": 400,
    "data": {
        "name": "品牌名必须提交",
        "logo": "地址必须不为空"
    },
    "msg": "提交的数据不合规范"
}

七、抽离全局异常处理

1. 心得体会

如果按照上面的写法我们要在每个校验的接口都写重复代码,所以我们要抽离出来做个全局异常。并且要改进一下,原来的是把错误信息放到data里,但是正常情况下的data是返回给前端的数据。我们这样把异常数据放进去,会使 data的数据有二义性 。这样对于前端就不知道里面是数据还是报错信息了哈,这样就可以直接前端展示msg里面的提示即可!

2. 书写ExceptionControllerAdvice

import com.wang.test.demo.response.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice(basePackages = "com.wang.test.demo.controller")
public class ExceptionControllerAdvice {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handleVaildException(MethodArgumentNotValidException e){

        log.error("数据校验出现问题:{},异常类型:{}",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        StringBuffer stringBuffer = new StringBuffer();
        bindingResult.getFieldErrors().forEach(item ->{
            //获取错误信息
            String message = item.getDefaultMessage();
            //获取错误的属性名字
            String field = item.getField();
            stringBuffer.append(field + ":" + message + " ");
        });
        return Result.failed(400, stringBuffer + "");

    }

    @ExceptionHandler(value = Throwable.class)
    public Result handleException(Throwable throwable){

        log.error("错误",throwable);
        return Result.failed(400, "系统异常");
    }
}

3. 测试结果

{
    "code": 400,
    "data": "",
    "msg": "logo:地址必须不为空 name:品牌名必须提交 "
}

八、分组校验

1. 需求

我们在做校验的时候,通常会遇到一个实体类的添加和修改,他们的校验规则是不同的,所以分组显得尤为重要。他可以帮助我们少建一个冗余的实体类,所以我们必须要会的。

2. 创建分组接口(不需写任何内容)

public interface EditGroup {
}
public interface AddGroup {
}

3. 在需要二义性的字段上添加分组

/**
 * 品牌id
 */
@NotNull(message = "修改必须有品牌id",groups = {EditGroup.class})
@Null(message = "新增不能指定id",groups = {AddGroup.class})
private Long brandId;

// 其余属性我们不变

4. 不同Controller添加校验规则

注意:我们要进行分组,所以 @Valid 不能使用了,要使用 @Validated 。相信大家已经看到上面的他俩区别了哈!

@PostMapping("/add")
public Result add(@Validated({AddGroup.class}) @RequestBody BrandEntity brandEntity){

    return Result.success("成功");
}

@PostMapping("/edit")
public Result edit(@Validated({EditGroup.class}) @RequestBody BrandEntity brandEntity){

    return Result.success("成功");
}

@PostMapping("/all")
public Result all(@Validated({AddGroup.class, EditGroup.class}) @RequestBody BrandEntity brandEntity){

    return Result.success("成功");
}

5. 在service类类中自己处理分组校验逻辑

也可以在service类类中自己处理分组校验逻辑,以下功能和上面一一对应。

// Controller
@PostMapping("/add")
public Result add(@Valid @RequestBody BrandEntity brandEntity){

    return Result.success("成功");
}
// Service
Set<ConstraintViolation<BrandEntity>> violations = validator.validate(req, AddGroup.class);
if (!CollectionUtils.isEmpty(violations)) {
    ConstraintViolation<BrandEntity> oneViolation = violations.iterator().next();
    throw new CommonException(oneViolation.getMessage());
}
// Controller
@PostMapping("/edit")
public Result edit(@Valid @RequestBody BrandEntity brandEntity){

    return Result.success("成功");
}
// Service
Set<ConstraintViolation<BrandEntity>> violations = validator.validate(req, EditGroup.class);
if (!CollectionUtils.isEmpty(violations)) {
    ConstraintViolation<BrandEntity> oneViolation = violations.iterator().next();
    throw new CommonException(oneViolation.getMessage());
}
// Controller
@PostMapping("/all")
public Result all(@Valid @RequestBody BrandEntity brandEntity){

    return Result.success("成功");
}
// Service
List<Class<?>> validateGroups = new ArrayList<Class<?>>() {{
      add(AddGroup.class);
      add(EditGroup.class);
 }};
Set<ConstraintViolation<CreateOrUpdateFlowRequest>> violations = validator
	.validate(req, validateGroups.toArray(new Class[0]));
if (!CollectionUtils.isEmpty(violations)) {
    ConstraintViolation<CreateOrUpdateFlowRequest> oneViolation = violations.iterator().next();
    throw new CommonException(oneViolation.getMessage());
}

九、自定义校验

1.定义自定义校验器

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

//编写自定义的校验器
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {

    private Set<Integer> set=new HashSet<Integer>();

    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] value = constraintAnnotation.vals();
        for (int i : value) {
            set.add(i);
        }
    }
    /**
     * 判断是否校验成功
     * @param value  需要校验的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return  set.contains(value);
    }
}

2. 定义一个注解配合校验器使用

@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
    // 使用该属性去Validation.properties中取
    String message() default "{com.atguigu.common.valid.ListValue.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    int[] vals() default {};

}

3. 实体类添加一个新的校验属性

注意:我们上面做了分组,如果属性不指定分组,则不会生效,现在我们的部分属性校验已没有起作用,现在只有 brandId和showStatus 起作用。

/**
 * 显示状态[0-不显示;1-显示]
 */
@NotNull(groups = {AddGroup.class, EditGroup.class})
@ListValue(vals = {0,1},groups = {AddGroup.class, EditGroup.class},message = "必须为0或者1")
private Integer showStatus;
JSR-303接口标准和参考实现 整合jsf2 bean验证需要的jar包,j2ee6规范jsr303 hibernate-validator-4.2.0.Final validation-api-1.0.0.GA 立即下载

相关推荐

GNSS接收机性能测试指标详解:TTFF、位置精度、灵敏度等关键参数如何评估

本文详细解析了GNSS接收机性能测试的关键指标,包括首次定位时间(TTFF)、位置精度、灵敏度等,帮助工程师系统评估接收机性能。通过多频段协同定位和载波相位测试等技术,提升定位精度至亚米级。同时,介绍了灵敏度测试的极限挑战和授时精度的专业测试方案,为GNSS接收机的性能优化提供实用指导。

cuda7parallel的博客 964

JSR-303数据校验

JSR-303数据校验

junR_980218的博客 2166

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南)

本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。

weixin_28314575的博客 869

SpirngBoot 中JSR数据校验的注解分类与如何使用

JSR数据校验的注解分类 和如何使用

weixin_52633911的博客 1125

TransUnet官方代码训练自己数据集(彩色RGB3通道图像的分割)

官方代码:https://github.com/Beckschen/TransUNet 目的:训练5个类别的汽车部件分割任务(测试在另一篇博客中) 实现效果: 1. github下载代码,并解压。 项目里的文件可能跟你下载的不一样,不急后面会讲到! 2. 配置数据集(尽最大努力还原官方数据集的格式)。 通常自己手上的数据集分images和labels文件夹,分别存放着原始图像和对应的mask图像,如下图所示; mask图像中的像素有0,1,2,3,4 分别代表背景,车身,轮子,车灯,窗户,一共五个

qq_37652891的博客 5万+

Python经常遇到导入xlwings就出错,如何解决

Python经常在导入xlwings时遇到错误。有人建议尝试重装或升级xlwings,但这些操作后仍然无法解决导入错误问题。

felix_8的博客 1740

SpringBoot:yaml注入,JSR303数据校验

一、yaml YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。 yaml语法采用多行缩进,对比XML格式,yaml精简、可读性高 yaml语法格式: 属性:空格 值 以缩进来控制层级关系,只要左对齐则是同一级 大小写十分敏感 二、yaml注入

半山腰太挤了,你要去山顶看看 1070

PLC编程入门基础知识

PLC即为可编程逻辑控制器,实质是一种专用于工业控制的计算机,其硬件结构基本上与微型计算机相同。

SANRENYIXING的博客 2万+

Java数据校验:JSR-303

1.简介 JSR是Java Specification Requests的缩写,意思是Java 规范提案 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation 即,JSR 303,Bean Validation规范 ,为Bean验证定义了元数据模型和API.。默认的元数据模型是通过Annotations来描述的,但是也可以使用XML来重载或者扩展。 2.常用校验注解 分类:Bean Validation 中内置的 constraint Constraint 详细信

xueguchen的博客 3万+

Open3D点云数据处理(六):点云、mesh可视化(Visualizer类)

本文介绍了Open3D中Visualizer类可视化几何对象的方法,给出了常用参数解释和代码示例。

孙悟空 3025

ATECC508A芯片开发笔记(四):自定义配置508功能,规划DataZone数据存储

ATECC508A芯片开发笔记(四):自定义配置508功能,规划DataZone数据存储 508A内部存储区介绍 Data Zone Config Zone 508A Config Zone配置(自定义) - ATECC508A芯片在使用之前,需要自定义配置ConfigZone与DataZone,并同Lock命令将两个区域锁住,否则无法正常使用功能。而一旦锁上就是永久性的,配置区不能够进行解锁

HowieXue 薛永浩的博客 2万+

Spring mvc参数校验

/** * Bean Validation 中内置的 constraint * @Null 被注释的元素必须为 null * @NotNull 被注释的元素必须不为 null * @AssertTrue 被注释的元素必须为 true * @AssertFalse 被注释的元素必须为 false ...

zhaomengxia123的博客 867

ADBMS1818芯片

 可测量多达18串电池电压 3 mV最大总测量误差 内置isoSPI接口 使用单根双绞线,长达100米 290 μs内可完成系统中所有单体电池电压测量。

m0_61973119的博客 4277

【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)

一、前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全。因为前端很容易拜托,当测试使用PostMan来测试,如果后端没有校验,不就乱了吗?肯定会有很多异常的。今天小编和大家一起学习一下JSR303专门用于参数校验的,算是一个工具吧! 二、JSR303简介 JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate...

HongYu012的博客 7774

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【SpringBoot商城秒杀系统项目实战10】JSR303参数校验+全局异常处理

JSR303参数校验 系统在登录的时候做了一个参数校验,也就是说每一个方法的开头都要去做一个校验,那么有没有更简洁的方法呢?那就是使用JSR 303 校验。 JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来。是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。 1.引入依赖: <dependency> <...

pitt1997的博客 2355

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

七、JSR303参数校验和全局异常处理

JSR303参数校验 系统需要登录时先做一个参数校验,有的方法同样也需要做参数校验,例如注册。 为了大量代码重复,这里使用JSR303校验 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star...

lahhass的博客 568

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

springboot整合JSR303参数校验与全局异常处理

我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全。因为前端很容易拜托,当测试使用PostMan来测试,如果后端没有校验,不就乱了吗?肯定会有很多异常的。今天小编和大家一起学习一下JSR303专门用于参数校验的,算是一个工具吧!JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。

jcc4261的博客 494

JSR303参数校验和全局异常处理

JSR303参数校验和全局异常处理 1.JSR303参数校验 1.1未使用JSR303的参数校验 主要是对登录表单中的密码和手机进行一个判断 @PostMapping("/doLogin") @ResponseBody public Result<Boolean> doLogin(LoginVo loginVo){ //日志输出 log.info(loginVo.toString()); String mobile = loginVo.getMobile();

xlshi1996的博客 270

SpringBoot使用JSR303参数校验并进行全局异常处理

SpringBoot使用JSR303参数校验 开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空,非null,整数值的范围,字符串的个数,日期,邮箱等等。最常见的就是我们直接写代码校验,这样以后比较繁琐,而且不够灵活。 不能总是写繁琐的代码来实现吧。 使用JSR303来做参数校验就方便并且整洁很多了。 pop引入依赖 1 2 3 4 5 ...

你好啊佩奇 621

SpringBoot秒杀系统实战10-JSR303参数校验+全局异常处理

文章目录 JSR303参数校验 全局异常处理 JSR303参数校验 系统在登录的时候做了一个参数校验,也就是说每一个方法的开头都要去做一个校验,那么有没有更简洁的方法呢?那就是使用JSR 303 校验。 JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来。是一个运行时的数据验证框架,在验证...

程序鹏 406

(5)SprintBoot 2.X JSR303 参数校验 + 全局异常处理

1. JSR303简介 JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。 此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证...

Java后端 727

秒杀(2) 实现登录功能,JSR303参数校验和全局异常处理

秒杀(2) 实现登录功能 登录逻辑分析: 步骤1:得到页面传过来的mobile、password。并根据mobile值从缓存中去找user是否存在。 步骤2:若缓存中有user,则执行下一步,比较密码是否一致。若缓存中没有user,则需要从数据库中找,如果找到,则执行下一步,比较密码是否一致。若也不存在,则抛出全局异常。 步骤3:验证密码,密码在页面传过来时已经经过md5加密,而且数据库中所存的密码是执行了两个md5的结果,因此,对密码应该进行一次md5加密才能进行比较,若密码相同,则说明信息正确,若不相同

weixin_41949555的博客 385

2-3 jsr303参数校验和全局异常处理

点击打开链接

qq_32814555的博客 242

JSR303参数校验+全局异常处理

 JSR3031.JSR 303 用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来。 2.是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。@RequestMapping("/do_Login") @ResponseBody //这个注解有点厉害 可以将返回值 转化为json 格式 输入 也可以转化为json? public Result&lt;B...

weixin_38035852的博客 4138

SpringBoot业务开发 05、SpringBoot集成JSR303实现参数校验+全局异常捕捉

对于请求参数校验一直都是一个比较麻烦的问题,因为一旦请求中的参数有多个时,我们如果仅仅通过一个个进行判断就会造成代码冗余的问题,很不优雅,对此本篇博客来介绍JSR303实现对参数的一个优雅校验。本章博客内容包含有认识JSR303的常用注解、实现基本的入参校验异常、自定义参数校验注解、实现分组校验以及全局异常捕捉优雅返回异常参数。博客目录索引(持续更新)需求:对于上方的一个属性的状态字段校验需求,我们需要对其进行自定义注解编写showStatus:状态不能为空,只能传入0或者1实现思路如下。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 1816
上一篇: 统一异常处理ControllerAdvice
下一篇: 史上最全的 Java 面试题和经典技术博文
狂奔的小棕棕
博客等级 码龄12年 359粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值