springboot基于AOP对参数进行判空处理

springboot对参数进行统一判空处理

一、前言

    本文章主要介绍java后端服务在常见得开发过程中遇到对表进行插入操作时,通常程序员不进行判空导致入库是程序bug,那么本小编主要介绍
springboot如何结合swagger对参数入参进行检查

二、技术介绍

主要通过springboot集成swagger,再基于springboot得AOP进行拦截,获取方法上加了@RequestBody注解的入参,并通过对应的入参的@ApiModelProperty注解的required属性进行判断该参数是否需要进行必填。

三、核心源码展示

1、实体上添加注解:

@Data
@ApiModel(value="【问题】群组表对象",description="【问题】群组表")
@TableName("t_question_group")
public class QuestionGroup extends Model<QuestionGroup> {
	private static final long serialVersionUID = 1L;

	@TableId(type= IdType.AUTO)
	@ApiModelProperty(value="问题组id",name="id")
    private Long id;
	@ApiModelProperty(value="归属用户id",name="userId")
    private Long userId;
	@ApiModelProperty(value="问题组标题",name="groupName",required = true)
    private String groupName;
	@TableLogic(value="0",delval = "1")
	@ApiModelProperty(value="是否删除 0否 1是",name="isDel")
    private Integer isDel;
	@ApiModelProperty(value="创建时间",name="createTime")
    private Date createTime;
	@ApiModelProperty(value="修改时间",name="updateTime")
    private Date updateTime;

}

2.controller层入参注解添加 @RequestBody


package com.jiuzhou.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jiuzhou.entity.QuestionGroup;
import com.jiuzhou.service.QuestionGroupService;
import com.jiuzhou.utils.RestResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 【问题】群组表
 * github地址 http://www.github.com/wanyushu
 * gitee地址 http://www.gitee.com/wanyushu
 * @author yushu
 * @email 
 * @date 2023-04-27 18:00:53
 */
@Api(tags = "【问题】群组表controller",value= "【问题】群组表相关接口")
@RestController
@RequestMapping("questionGroup")
public class QuestionGroupController {
    @Autowired
    private QuestionGroupService questionGroupService;


    /**
     * 根据id删除对应的问题组
     */
    @ApiOperation(value = "新增聊天组")
    @PostMapping("save")
    public RestResult save(@RequestBody QuestionGroup questionGroup,@RequestHeader("userId")Long userId){
        if(StringUtils.isEmpty(questionGroup.getGroupName())){
            return  RestResult.failed("新增聊天组名不能为空");
        }
        questionGroup.setCreateTime(new Date());
        questionGroup.setUserId(userId);
        questionGroup.setIsDel(0);
        questionGroupService.save(questionGroup);
        return RestResult.ok();
    }

3、创建切面AOP


package com.jiuzhou.aspect;

import com.alibaba.fastjson.JSON;
import com.jiuzhou.exception.ServiceException;
import io.swagger.annotations.ApiModelProperty;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;

@Aspect
@Component
public class ParameterCheckAspect {

    @Pointcut("execution(public * com.jiuzhou.controller.*.*(..))")
    public void controllerMethods() {}

    @Before("controllerMethods()")
    public void checkParameters(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        Parameter[] parameters = method.getParameters();

        for (int i = 0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            Annotation[] annotations = parameter.getAnnotations();
            for (Annotation annotation : annotations) {
                if (annotation.annotationType().equals(RequestBody.class)) {
                    Object arg = joinPoint.getArgs()[i];
                    checkFields(arg);
                }
            }
        }
    }

    private void checkFields(Object arg){

        List<String> emptyFields = new ArrayList<>();

        Field[] fields = arg.getClass().getDeclaredFields();
        //检查 NotNull注解
        validFieldNotNull(arg,fields,emptyFields);
        // 判断是否有属性为空的字段
        if (!emptyFields.isEmpty()) {
            // 处理属性为空的逻辑,例如返回错误信息或抛出异常
            throw new ServiceException(500,JSON.toJSONString(emptyFields)+"不能为空");
        }
    }

    private void validFieldNotNull(Object arg,Field[] fields,List<String> emptyFields){
        for (Field field : fields) {
            // 判断字段是否加了NotNull注解
            if (field.isAnnotationPresent(ApiModelProperty.class)) {
                // 设置字段可访问,否则会抛出IllegalAccessException异常
                field.setAccessible(true);
                try {
                    ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
                    // 判断字段值是否为空
                    if (apiModelProperty.required()&&(field.get(arg) == null||field.get(arg)=="")) {
                        emptyFields.add(field.getName());
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }
        }
    }
}

四、演示截图

1、请求项目url

http://127.0.0.1:8081/questionGroup/save

在这里插入图片描述
响应正常!
2、测试不正常情况
在这里插入图片描述
通过上面的演示,实体加上required=true后,spring将做判空处理,此处设计添加了批量字段为空的情况下,统一返回对个字段对应的不能为空的响应。

五、注意事项

上述的小编简单介绍并演示了springboot如何基于swagger文档进行判空的处理,如若需要对其集合判空 可在切面处添加处理
本章不做详细讲解,如需后续了解更多的springboot框架实用使用技巧,请点个赞,点个关注吧!


  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值