若依参数校验、参数分组校验、异常抛出、统一异常处理

真实业务
在这里插入图片描述

1.实体类

package com.rjgf.manage.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.rjgf.common.annotation.Excel;
import com.rjgf.common.core.domain.BaseEntity;
import com.rjgf.manage.other.ValidParameterGroup;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;

/**
 * 基础用户对象 common_user
 *
 * @author 
 * @date 2022-10-21
 */
public class CommonUser extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空", groups = {ValidParameterGroup.Update.class})
    private Long userId;

    /**
     * 部门ID
     */
    private Long deptId;

    /**
     * 用户账号
     */
    @NotBlank(message = "用户账号不能为空", groups = {ValidParameterGroup.Insert.class, ValidParameterGroup.Update.class})
    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @Excel(name = "用户账号")
    private String userName;

    /**
     * 用户昵称
     */
    @Excel(name = "用户昵称")
    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @NotBlank(message = "用户昵称不能为空", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    private String nickName;

    /**
     * 用户类型(00系统用户)
     */
    private String userType;

    /**
     * 用户邮箱
     */
    @Size(min = 0, max = 50, message = "用户邮箱长度不能超过50个字符", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @NotBlank(message = "用户邮箱不能为空", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @Excel(name = "用户邮箱")
    private String email;

    /**
     * 手机号码
     */
    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @NotBlank(message = "手机号码不能为空", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @Excel(name = "手机号码")
    private String phonenumber;

    /**
     * 用户性别(0男 1女 2未知)
     */
    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
    private String sex;

    /**
     * 头像地址
     */
    private String avatar;

    /**
     * 密码
     * 不传递密码给前端,但是后端数据库查出来使用,允许前端传密码过来
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @Size(min = 0, max = 30, message = "密码长度不能超过30个字符", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    @NotBlank(message = "密码不能为空", groups = {ValidParameterGroup.Insert.class,ValidParameterGroup.Update.class})
    private String password;

    /**
     * 帐号状态(0正常 1停用)
     */
    private String status;

    /**
     * 删除标志(0代表存在 2代表删除)
     */
    private String delFlag;

    /**
     * 最后登录IP
     */
    private String loginIp;

    /**
     * 最后登录时间
     */
    private Date loginDate;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getDeptId() {
        return deptId;
    }

    public void setDeptId(Long deptId) {
        this.deptId = deptId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getDelFlag() {
        return delFlag;
    }

    public void setDelFlag(String delFlag) {
        this.delFlag = delFlag;
    }

    public String getLoginIp() {
        return loginIp;
    }

    public void setLoginIp(String loginIp) {
        this.loginIp = loginIp;
    }

    public Date getLoginDate() {
        return loginDate;
    }

    public void setLoginDate(Date loginDate) {
        this.loginDate = loginDate;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("userId", getUserId())
                .append("deptId", getDeptId())
                .append("userName", getUserName())
                .append("nickName", getNickName())
                .append("userType", getUserType())
                .append("email", getEmail())
                .append("phonenumber", getPhonenumber())
                .append("sex", getSex())
                .append("avatar", getAvatar())
                .append("password", getPassword())
                .append("status", getStatus())
                .append("delFlag", getDelFlag())
                .append("loginIp", getLoginIp())
                .append("loginDate", getLoginDate())
                .append("createBy", getCreateBy())
                .append("createTime", getCreateTime())
                .append("updateBy", getUpdateBy())
                .append("updateTime", getUpdateTime())
                .append("remark", getRemark())
                .toString();
    }
}

2.参数分组

建议一定要分,不能因为业务简单,业务变化是无法想象的,不能早期为了省事,以后难以维护。

package com.rjgf.manage.other;

import javax.validation.groups.Default;

/**
 * @author 
 * 进行参数校验分组
 */
public interface ValidParameterGroup extends Default {

    interface Insert {
    }

    interface Update {

    }

    interface Query {

    }

    interface Delete {
    }

}

3.控制器校验参数

  /**
     * 新增基础用户
     */
    @PreAuthorize("@ss.hasPermi('manage:user:add')")
    @Log(title = "基础用户", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated(value = ValidParameterGroup.Insert.class) @RequestBody CommonUser commonUser) {
        return toAjax(commonUserService.insertCommonUser(commonUser));
    }

    /**
     * 修改基础用户
     */
    @PreAuthorize("@ss.hasPermi('manage:user:edit')")
    @Log(title = "基础用户", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@Validated(value = ValidParameterGroup.Update.class) @RequestBody CommonUser commonUser) {
        return toAjax(commonUserService.updateCommonUser(commonUser));
    }

4.业务层抛出若依自带异常

    /**
     * 参数校验
     */
    public void checkUpdateUserParameter(CommonUser oldUser, CommonUser newUser) {

        String username = newUser.getUserName(),
                phoneNumber = newUser.getPhonenumber(),
                email = newUser.getEmail();
        //做了修改
        if (!StringUtils.equals(oldUser.getUserName(), newUser.getUserName())) {
            if (commonUserMapper.checkUserNameUnique(username) > 0) {
                throw new BaseException("保存用户" + username + "失败,注册账号已存在");
            }
        } else if (!StringUtils.equals(oldUser.getPhonenumber(), newUser.getPhonenumber())) {
            if (commonUserMapper.checkUserPhoneNumberUnique(phoneNumber) > 0) {
                throw new BaseException("保存用户" + username + "失败,电话号码已存在");
            }
        } else if (!StringUtils.equals(oldUser.getEmail(), newUser.getEmail())) {
            if (commonUserMapper.checkUserEmailUnique(email) > 0) {
                throw new BaseException("保存用户" + username + "失败,邮箱已存在");
            }
        }
    }

5.在控制器层捕捉异常

5.1 自己抛出的异常

package com.rjgf.manage.exception;


import com.rjgf.common.core.domain.AjaxResult;
import com.rjgf.common.exception.base.BaseException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * @author 
 * BaseException 是框架基础异常类,继承RuntimeException
 * 统一处理自定义异常,将提示消息返回
 */

@RestControllerAdvice(basePackages = "com.rjgf.manage.controller")
public class BaseExceptionHandle {
    @ExceptionHandler(BaseException.class)
    public AjaxResult handleBaseException(BaseException e) {
        return AjaxResult.error(e.getDefaultMessage());
    }
}

5.2 参数校验异常

package com.rjgf.manage.exception;

import com.rjgf.common.core.domain.AjaxResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

/**
 * @author 
 * <p>
 * 统一处理参数校验异常,将提示消息返回
 */

@RestControllerAdvice(basePackages = "com.rjgf.manage.controller")
public class ValidParameterException {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult handleBaseException(MethodArgumentNotValidException e) {
        return AjaxResult.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
    }
}

### 回答1: Lombok并不提供参数校验的功能。但是,你可以结合其他的参数校验框架,例如javax.validation或Hibernate Validator来实现参数校验。 你可以在Java Bean的属性上添加注解,例如@NotNull、@Min、@Max等,来指定属性的校验规则。然后在需要进行参数校验的地方,使用校验器进行校验。例如,可以使用javax.validation.Validator类的validate方法来对Java Bean进行校验。 以下是一个使用Hibernate Validator进行参数校验的例子: ```java import javax.validation.constraints.NotNull; public class User { @NotNull(message = "用户名不能为空") private String username; // 省略其他属性和方法 } import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; public class UserService { private Validator validator; public UserService() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } public void createUser(User user) { Set<ConstraintViolation<User>> violations = validator.validate(user); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); } // 创建用户 } } ``` 在上面的例子中,User类的username属性使用了@NotNull注解指定了非空校验规则。UserService类的createUser方法中,使用了Hibernate Validator提供的Validator类进行校验。如果校验不通过,则会抛出ConstraintViolationException异常。 ### 回答2: Lombok是一个Java库,它可以通过简化代码来提高开发效率。在使用Lombok进行参数校验时,可以使用注解来自动生成参数校验的代码。 Lombok提供了多个与参数校验相关的注解,包括@NonNull、@NotNull、@NotBlank、@NotEmpty等。这些注解可以用于方法的参数、属性或局部变量上。使用这些注解后,Lombok会自动为我们生成参数校验的代码,包括检查参数是否为null、是否为空字符串或集合。 例如,当我们在一个方法的参数前使用@NonNull注解时,Lombok会自动生成对该参数进行空检查的代码。这样,当我们调用该方法时,如果参数为null,Lombok会在运行时抛出NullPointerException异常,从而避免了空指针异常的发生。 同时,Lombok还提供了@Builder注解,可以用于生成Builder模式的代码。通过在类上注解@Builder,Lombok会自动为该类生成一个内部静态类Builder,并为类的所有属性生成相应的setter方法。在使用Builder模式创建对象时,我们可以通过链式调用来设置不同的属性,而不必编写大量的setter方法。 总之,Lombok提供了一系列注解,通过简化代码来实现参数校验。它可以帮助开发人员提高开发效率,并提供更加优雅和安全的代码编写方式。无论是在小型项目还是大型项目中,使用Lombok进行参数校验都可以使代码更加简洁、可读性更强,同时也能提高开发效率。 ### 回答3: Lombok是一个Java库,可以简化代码开发,提高开发效率。其中,Lombok的参数校验功能是一个非常有用的特性。 在传统的Java开发中,我们需要手动编写大量的参数校验代码,来确保输入的参数满足要求,且不会导致程序出错。而使用Lombok的参数校验功能,可以极大地简化这个过程。 使用Lombok的参数校验功能,我们只需要在需要校验参数前加上相应的注解,就可以实现校验的功能。常用的校验注解有@NotNull(非空校验)、@NotBlank(非空且非全空格校验)、@Min(最小值校验)等。 举个例子,假如我们需要校验一个用户的姓名和年龄。我们可以在用户对象的姓名和年龄字段上分别加上@NotBlank和@Min注解,如下所示: public class User { @NotBlank private String name; @Min(0) private int age; } 这样,当我们创建一个User对象时,Lombok会自动帮我们校验姓名和年龄是否满足要求。如果不满足,Lombok会抛出相应的异常,提示我们输入的参数有误。 通过使用Lombok的参数校验功能,我们可以避免手动编写大量的校验代码,可以提高开发效率,减少出错的可能性。但需要注意的是,Lombok的参数校验功能只是对参数的基本校验,对于复杂的校验逻辑,还需要自己进行额外的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值