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框架实用使用技巧,请点个赞,点个关注吧!