springboot自定义注解 判断参数是否传递或者为空
原文链接:https://blog.csdn.net/weixin_37535975/article/details/94443617
1.自定义个注解类
@Target({ElementType.PARAMETER})//参数级别 @Retention(RetentionPolicy.RUNTIME) //注解保留到运行阶段 public @interface ParamsNotNull { }
@Target
通俗讲,定义放在什么位置,这个是放在参数中
此外还有
1.ElementType.CONSTRUCTOR:用于描述构造器
2.ElementType.FIELD:用于描述域(类的成员变量)
3.ElementType.LOCAL_VARIABLE:用于描述局部变量(方法内部变量)
4.ElementType.METHOD:用于描述方法
5.ElementType.PACKAGE:用于描述包
6.ElementType.PARAMETER:用于描述参数
7.ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention 定义了该Annotation被保留的时间长短,有些只在源码中保留,有时需要编译成的class中保留,有些需要程序运行时候保留。即描述注解的生命周期
此时针对的在运行中,此外还有
1.RetentionPoicy.SOURCE:在源文件中有效(即源文件保留)
2.RetentionPoicy.CLASS:在class文件中有效(即class保留)
2.自定义拦截器,具体判断请求来的参数
/** * @Description 参数检查注解拦截器 */ public class CheckParamsInterceptor extends HandlerInterceptorAdapter { private static Logger logger = LoggerFactory.getLogger(CheckParamsInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { logger.warn("UnSupport handler"); return true; } List<String> list = getParamsName((HandlerMethod) handler); for (String s : list) { String parameter = request.getParameter(s); if (StringUtils.isEmpty(parameter)){ JSONObject jsonObject = new JSONObject(); //这个地方是定义缺少参数或者参数为空的时候返回的数据 jsonObject.put("status", 203); jsonObject.put("msg", "缺少必要的"+s+"值"); response.setHeader("Content-type", "application/json;charset=UTF-8"); response.setHeader("Access-Control-Allow-Origin", "*");//跨域 response.getWriter().write(jsonObject.toJSONString()); return false; } } return true; }
/** * 获取使用了该注解的参数名称 */ private List getParamsName(HandlerMethod handlerMethod) { Parameter[] parameters = handlerMethod.getMethod().getParameters(); List<String> list = new ArrayList<>(); for (Parameter parameter : parameters) { //判断这个参数时候被加入了 ParamsNotNull. 的注解 //.isAnnotationPresent() 这个方法可以看一下 if(parameter.isAnnotationPresent(ParamsNotNull.class)){ list.add(parameter.getName()); } } return list; }
3.添加校验的拦截器config
@Configuration public class WebMvcConfig implements WebMvcConfigurer { CheckParamsInterceptor checkSourceInterceptor = new CheckParamsInterceptor(); //增加校验拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 这个地方可以定义拦截器的具体的路径 registry.addInterceptor(checkSourceInterceptor).addPathPatterns("/**"); } }
4.写一个测试类测试一下效果
@RestController @RequestMapping("/test") public class TestController { @RequestMapping("/test") //注解不要加,在参数类型前边加上 public String test(@ParamsNotNull String userId){ return "ok"; } }
这个是当参数为空的时候的校验
这个是没有这个参数属性的时候,其实效果是一样的
这样以后再判断参数是不是为空的时候,直接加个注解就可以了~!就不用再单独判断参数为空啦!
原文链接:https://blog.csdn.net/weixin_37535975/article/details/94443617
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现